• 【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
  • 相关阅读:
    内存调试工具valgrind的使用
    C++中或运算符(||)执行的逻辑及顺序
    JVM 执行引擎部分 (编译器、解释器)
    springboot系列(七):如何通过mybatis-plus实现接口增删改查|超级详细,建议收藏
    什么是项目管理?一文了解项目管理的概念、历史、内容和方法
    # Leetcode刷题day7|454.四数相加II, 383. 赎金信,15. 三数之和 ,18四数之和
    移远通信5G RedCap模组拿下首个中国移动5G物联网开放实验室5G及轻量化产品能力认证
    Html 后端了解基础
    使用$test$plusargs提高RTL验收速度
    努力一周,开源一个超好用的接口Mock工具——Msw-Tools
  • 原文地址:https://blog.csdn.net/hot7732788/article/details/126389309