zoukankan      html  css  js  c++  java
  • flask的各种装饰器

    效果类似于Django的process_request装饰器

    @app.before_request
    def before(*args,**kwargs):
        print('请求之前')
        '''
        如果允许通过访问,可以return None
        该装饰器装饰的函数如果有return其他内容则直接结束访问,
        效果有点类似django的process_reqeust中间件方法。
        比如通过这个装饰器写登陆验证,判断其是否有session,没有则不允许访问,有则继续访问
        然后通过request.path判断访问的函数,如果是登陆(白名单)则通过。
        request.url 是完整的url
        request.path是域名后面的url正则
        '''
        if request.path == '/login':
            return None
        user = session.get('user_info')
        if user:
            return None
        return redirect('/login')
    before_request

    第一次来请求操作的装饰器

    @app.before_first_request
    def first(*args,**kwargs):
        pass
    '''
    只有第一次请求时候才执行的函数装饰器
    '''
    before_first_request

    类似于process_response

    @app.after_request
    def after(response):
        #效果和process_response是一样的,必须有返回值,没有则报错。
        print('我走了')
        return response
    after_request

    flask中间件装饰器的执行顺序:

      如果多个app.before_request和app.after_request,
      那么执行顺序也和django类似,
      app.before_request是按照从上而下执行(文件的上下),app.after_request是自下而上执行。
      如果在app.before_request中return了其他内容,请求被拦截,那么不会执行视图函数,
      直接从最后一个app.after_reqeust倒着开始执行所有after_request
     
     
    自定义错误页面
     @app.error_handlers(404)
     def error_404(arg):
          '''自定义错误页面,根据状态码定制'''
          return "404错误啦"
    
    
    根据状态码自定义错误页面
    error_handlers
     
     
     
    模板中定制方法:
     
    前端直接调用后端函数的装饰器
    @app.template_global()
    def xx(a1,a2):
        return a1+a2
    '''
    这个装饰器的作用就是,可以在前端直接通过{{ xx(1,2)}}来调用后端的这个函数。
    '''

    相当于filter的装饰器

    @app.template_filter()
    def db(a1,a2,a3):
        return a1+a2+a3
    '''
    效果和django的Filter相似,前端渲染的时候需要注意写法
    {{ 1|db(2,3)}} 1是第一个参数,后面是2,3参数。
    '''

    重写app.wsgi_app:

      

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/index')
    def index():
        print('index')
        return "Index"
    
    
    class Middleware(object):
        def __init__(self,old):
            self.old = old
    
        def __call__(self, *args, **kwargs):
            print('开始之前')
            ret = self.old(*args, **kwargs)
            print('开始之后')
            return ret
    
    
    if __name__ == '__main__':
        app.wsgi_app = Middleware(app.wsgi_app)
        app.run()

    通过重写这个类的__call__方法,效果同django的process_request,process_response

     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    VMware中Ubuntu 14.04出现Unknown Display问题解决
    VMWare桥接、NAT和only-host三种模式
    Tomcat目录下文件详解
    Java socket2
    Java socket1
    网络基础知识
    java awt 乱码问题
    窗口Dialog
    windowsEvents
    鼠标适配器Adapter
  • 原文地址:https://www.cnblogs.com/HZY258/p/9174969.html
Copyright © 2011-2022 走看看