Flask -- 特殊装饰器

之前有说过给Flask中的视图加装饰器,那么问题来了。我有100个视图。每个视图都需要加装饰器,那就要一个一个的加,这样很麻烦。

如果。有django中的中间件一样的功能就好了。

那么它来了。

它就是特殊的装饰器

before_request

这个装饰器的意思是在请求接收后。到达视图之前进行。

from flask import Flask, render_template, redirect, request, session

app = Flask(__name__, template_folder="templates", static_folder="static", static_url_path="/statics" ) app.secret_key = '123' app.config.from_object(Debugsetting) # app.config.from_object(Tessingsetting) @app.before_request  # 使用装饰器 def be(): if request.path == '/login':  # 判断请求路径。如果是登陆,放行 return None elif session.get('user'):  # 如果get到session中的数据说明已经登陆 return None else: return redirect('login')  如果get不到session中的数据,说明没有登陆

@app.route('/login', methods=['GET', 'POST'], endpoint='login')
def login():
if request.method == 'GET':
return render_template('login.html')
user = request.form.get('username')
pwd = request.form.get('pwd')
if user == '123' and pwd == '123':
session['user'] = user
return render_template('index.html')
@app.route('/index',endpoint='index',)
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
 

after_request

视图函数结束 响应客户端之前执行该装饰器

@app.after_request
def foot_log(response):
    if request.path != "/login":
        print("有客人访问了",request.path)
    return response

值得一提的是。在Flask中可以存在多个 before_request 和 after_request 

before_request  的执行顺序是代码编写顺序执行

after_request 的执行顺序是按代码编写顺序倒序执行

另外在 after_request 中必须写一个形参来接收 返回值 ,并且把接收的返回值 返回

注意 : before_request 和 after_request 执行时。先执行全局的(主启动文件中的)在执行局部的(蓝图文件中的)

errorhandler

这个装饰器在出现404 / 500 这样的错误,用来返回一个页面或重定向

@app.errorhandler(404)
def error(msg):
print(msg)
return redirect('http://www.baidu.com')

需要注意的是 errorhandler 后写的参数必须是 int 类型

所装饰的函数必须有一个形参来接受  errorMessage

 

 最后,说一下特殊装饰器的请求生命周期

 

posted @ 2019-07-11 21:22  __Invoker  阅读(143)  评论(0编辑  收藏  举报