• 10. Flask请求扩展


    一、请求扩展与中间件

    ​ flask 可以通过 扩展(装饰器)来实现类似于django 中间件的功能

    1. @app.before_first_request

    ​ 类似Django中间件,在执行视图函数之前,之后执行默写功能

    执行一次,第一次请求结束,在第一批函数执行后就不再执行(状态改为False)
    
    @app.before_first_request
    def before_first_request1():
        print('before_first_request1')
    

    2. @app.before_request: process_request

    在视图函数执行前,按照顺序依次执行(列表顺序)
    
    @app.before_request
    def before_request1():
        Request.nnn = 123
        print('before_request1')
    
    
    @app.before_request
    def before_request2():
    	print('before_request2')
    
    登录验证
    
    @user.before_request
    def check(*args,**kwargs):
        if request.path == '/login':
            return None
        elif session.get('user_info'):
            return None
        else:
            return redirect('/login') 
    

    3. @app.after_request: process_response

    在视图函数执行后,按照反序依次执行(列表逆序)
    
    @app.after_request
    def after_request1(response):
        print('before_request1', response)
        return response
    
    
    @app.after_request
    def after_request2(response):
        print('before_request2', response)
        return response
    

    注意:请求被 before_request 拦截后,所有的 response会执行;另外:扩展可以只对 单独的蓝图对象生效,也可以对全局的 app 都生效

    4. @app.errorhandler(404) 定制错误信息

    @app.errorhandler(404)
    def page_not_found(error):
    	return render_template('404.html'),404
    

    5. @app.template_global()

    @app.template_global()装饰器   
    def func(a,b,c)  --->>  全局temlate使用 {{func(a,b,c)}}
    
    @app.template_filter()装饰器
    def func(a,b,c)  --->>  全局temlate使用 {{a|filter(b,c)}}  # 需要管道符
    
    

    6. 根据flask的请求入口,实现类似中间件的操作

    class  Middleware(object):
    	def __int__(self,old_wsgi_app):
        	self.old_wsgi_app = old_wsgi_app
        
        def __call__(self, environ, start_response):
            print('before')
            ret = self.old_wsgi_app(environ, start_response)
            print('after')
            return ret
            
    if __name__ == '__main__':
        app.wsgi_app = Middleware(app.wsgi_app)
        app.run()
    
  • 相关阅读:
    MySQL锁之一:锁详解
    eclipse maven plugin 插件 安装 和 配置
    火星坐标系统
    使用Spring MVC统一异常处理实战
    websocket之二:WebSocket编程入门
    spring mvc 异常统一处理方式
    Android面向HTTP协议发送post请求
    用JAX-WS在Tomcat中公布WebService
    css3 -> 多栏布局
    NSLayoutConstraint-代码实现自己主动布局的函数使用方法说明
  • 原文地址:https://www.cnblogs.com/hq82/p/12679429.html
Copyright © 2020-2023  润新知