zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    Java Web之Tomcat
    Java Web之HTML5
    Java 读取propertoes文件
    SQL Server 触发器
    通过关闭 UseDNS和GSSAPIAuthentication选项加速 SSH登录
    数据库创建索引有什么优点和缺点
    修改查看MYSQL字符集(charset)
    MySQL 数据类型
    远程连接mysql数据库提示:ERROR 1130的解决办法
    怎么快速了解自己的MySQL服务器?
  • 原文地址:https://www.cnblogs.com/hq82/p/12679429.html
Copyright © 2011-2022 走看看