• 【Flask基础】六,拦截器/请求钩子(全局+模块+资源选择性放行)


    在这里插入图片描述

    全局拦截器

    # coding:utf-8
    from flask import Flask, request, url_for
    
    app = Flask(__name__)
    
    @app.route("/index")
    def index():
        return "index page"
    
    
    @app.before_first_request
    def handle_before_first_request():
        """在第一次请求处理之前先被执行"""
        print("handle_before_first_request 被执行")
    
    
    @app.before_request
    def handle_before_request():
        """在每次请求之前都被执行"""
        print("handle_before_request 被执行")
    
    
    @app.after_request
    def handle_after_request(response):
        """在每次请求(视图函数处理)之后都被执行, 前提是视图函数没有出现异常"""
        print("handle_after_request 被执行")
        return response
    
    
    @app.teardown_request
    def handle_teardown_request(response):
        """在每次请求 (视图函数处理)之后都被执行, 无论视图函数是否出现异常,都被执行, 工作在非调试模式时 debug=False"""
        path = request.path  #获取请求路径
        if path == url_for("index"):
            print("在请求钩子中判断请求的视图逻辑: index")
        elif path == url_for("hello"):
            print("在请求钩子中判断请求的视图逻辑: hello")
        print("handle_teardown_request 被执行")
        return response
    
    
    if __name__ == '__main__':
        app.run()
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    模块拦截器(单个蓝图模块文件)

    comment = Blueprint('comment', __name__)
    
    # #评论操作前通过模块拦截器判断--用户是否登录
    @comment.before_request
    def before_comment():
        #未登录情况下允许获取评论
        if session.get('islogin') is None or session.get('islogin') != 'true':
            # return '你还没有登录,不能发表评论'
            return 'not-login'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    资源选择性放行(通过匹配url后缀方式)

    • 代码为后续项目实战代码的一部分,学习方法即可。
    # 定义全局拦截器,实现自动登录,并且选择性放行数据访问
    @app.before_request
    def before():
        url = request.path
    
        #需要通过的网站接口列表
        pass_list = ['/user', '/login', '/logout']
        if url in pass_list or url.endswith('.js') or url.endswith('.jpg'): #静态资源也需要放开访问
            pass
        elif session.get('islogin') is None:
            username = request.cookies.get('username')
            password = request.cookies.get('password')
            if username != None and password != None:
                user = Users()
                result = user.find_by_username(username)
                if len(result) == 1 and result[0].password == password:
                    session['islogin'] = 'true'
                    session['userid'] = result[0].userid
                    session['username'] = username
                    session['nickname'] = result[0].nickname
                    session['role'] = result[0].role
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    Pytorch 快速参数权重初始化
    看微功耗遥测终端机如何轻松应对野外环境挑战?
    Linux-信号2
    【LeetCode高频SQL50题-基础版】打卡第8天:第41~45题
    如何使用 FastAPI 部署 NLP 模型?
    C语言中整型与浮点型在内存中的存储
    PageRank(下):数据分析 | 数据挖掘 | 十大算法之一
    tcl之事务
    excel 无法删除有合并单元格的列内容时的替代方法
    Ubuntu系统环境一系列问题解决方案
  • 原文地址:https://blog.csdn.net/hot7732788/article/details/126389309