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

 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/HZY258/p/9174969.html
今日推荐