flask 请求扩展 蓝图 g对象

内容详细

1 请求扩展

        # 在请求来了,请求走了,可以做一些校验和拦截,通过装饰器来实现 7 个
        # 1 before_request
        类比django中间件中的process_request,在请求收到之前绑定一个函数做一些事情
        # 2 after_request
        # 3 before_first_request
        # 4 teardown_request
        # 5 errorhandler
        # 6 template_global
        # 7 template_filter

        from flask import Flask,request,render_template


        app=Flask(__name__)
        # app.debug=True
        # 请求扩展之before_request,在进入视图函数之前执行,如果有多个,是从上往下执行
        @app.before_request
        def before():
            # 判断是否登录,如果登录了继续往下走,如果没登陆
            # request.xxx='lqz'  可以往请求中放值,后续可以取出来,只针对于当次请求有效
            print("我执行了1111")

        # @app.before_request
        # def before1():
        #     # 判断是否登录,如果登录了继续往下走,如果没登陆
        #     print("我执行了2222")


        # 请求走了,会执行它,注册多个,按照从下往上的顺序执行
        @app.after_request
        def after(response):
            # 写入cookie,写入响应头。。。处理跨域
            print(response)
            print("请求走了1111")
            return response
        # @app.after_request
        # def after2(response):
        #     print(response)
        #     print("请求走了2222")
        #     return response


        # before_first_request 只会执行一次,以后就不执行了,跟用户无关,做一些初始化的工作
        @app.before_first_request
        def first():
            print("我的第一次")



        #teardown_request 每一个请求之后绑定一个函数,即使遇到了异常,debug为false的情况下
        @app.teardown_request
        def teardown(e):
            print(e)  # 记录日志,错误日志request.method
            print("我是teardown")

        # errorhandler 绑定响应状态码,当状态码一致,就会执行它
        @app.errorhandler(404)
        def err_404(arg):
            print(arg)
            return render_template('404.html')


        @app.errorhandler(500)  # 500错误的返回
        def err_500(arg):
            print(arg)
            return render_template('500.html')


        # 标签template_global
        @app.template_global()
        def add(a1, a2):
            return a1 + a2


        # 过滤器template_filter
        @app.template_filter()
        def add2(a1, a2, a3):
            return a1 + a2 + a3

        @app.route('/')
        def index():
            # raise Exception("错误")

            l=[1,2,4]
            print(l[9])
            print("我是视图函数")
            return "hello web"
        @app.route("/home")
        def home():

            return render_template('home.html')
        if __name__ == '__main__':
            app.run()

2 蓝图

        # blueprint--->现在项目都是单个py文件--》想划分目录--》自己定制目录结构--》app经常用---》各个文件中导来导去---》出现循环引入问题
        # 一个项目有多个app,每个app有自己一套路由,使用蓝图来管理

        # 第一步:定义蓝图对象
        user = Blueprint('user', __name__)
        # 第二步:使用蓝图写路径,写请求扩展(只针对于当前蓝图生效)
        @user.route('/index')
        # 第三步:把蓝图注册进app中
        app.register_blueprint(user)



        # 小型项目目录划分
        pro_flask
            -pro_flask
            -__init__.py
            -statics
            -templates
            -views
              account.py
              user.py
              blog.py
          -run.py


         # 大型项目 --》有多个app
        pro_flask 
          -pro_flask # 包
            __init__.py # 包的init
            admin # 包
                __init__.py # 包的init
                static # 自己的静态文件
                templates# 自己的模板文件
                models.py
                views.py # 自己的视图函数
            web   # 包
                __init__.py
                static 
                templates
                views.py

          -run.py   # 启动文件


        # 以后如何划分,千奇百怪,但是都使用蓝图来做,蓝图管理自己的路由和请求扩展

3 g对象

        # global的缩写,为了实现在同一个请求中,传递数据,上下文传递,赋值取值只针对于当次请求生效


        # 类比 django 中的 request对象,内有context 属性
            django中间件中,假设想放到request中一个数据
          request.name="lqz"
          rerquest.context['name']='lqz'
          rerquest.context['method']='nb'
          到视图函数中,就可以取出来



         # g和session有什么区别?
            -g只针对于当次请求
          -session针对于多次请求
posted @ 2022-05-22 23:10  风花雪月*  阅读(31)  评论(0编辑  收藏  举报