Flask 给视图函数增加装饰器

Posted 铠甲巨人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask 给视图函数增加装饰器相关的知识,希望对你有一定的参考价值。

在@app.route的情况下增加装饰器的写法:

 1 from flask import Flask,request,render_template,redirect,session,url_for,views
 2 from flask import render_template
 3 
 4 app = Flask(__name__) #实例化flask对象
 5 app.debug = True   #能够随时更改自动重启,不加的话每次更改代码需要手动重启
 6 app.config[SECRET_KEY] = 123456   #secret_key,用于给session加密
 7 
 8 
 9 
10 @app.route(/login,methods=[GET,POST],endpoint=t1) #endpoint是url的别名,相当于django中Url的name
11 def login():
12     if request.method == "GET":
13         # res = request.query_string
14         # print(res)  获取通过GET请求url传过来的参数
15         return render_template(login.html)
16     else:
17         user = request.form.get(user)
18         pwd = request.form.get(pwd)
19         if user == tom and pwd == 123:
20             session[userinfo] = user   #设置session
21             return render_template(hello.html)
22         return render_template(login.html, error=用户名或密码错误)
23 
24 def wapper(func):
25     def inner(*args,**kwargs):
26         user = session.get(user_info)
27         if not user:
28             return redirect(/login)
29         return func(*args,**kwargs)
30     return inner
31 
32 
33 @app.route(/detail/<int:nid>,methods=[GET],endpoint=n1)
34 @wapper
35 def detail(nid):
36     print(nid)
37     return render_template(hello.html)
38 ‘‘‘
39 如果给一个视图函数增加装饰器,应该加在app.route下面,这样的效果就是,
40 装饰器将下面的所有内容包裹,然后路由对应到这大的包裹中来。
41 需要注意endpoint要注明,如果不注明endpoint则默认用函数名来定义,
42 此时所有的函数名都叫inner了,所以需要注明endpoint,只是为了区分。
43 ‘‘‘
44 
45 if __name__ == __main__:
46     app.run()

另一种写法:

 1 import functools
 2 def wapper(func):
 3     @functools.wraps(func)
 4     def inner(*args,**kwargs):
 5         return func(*args,**kwargs)
 6     return inner
 7 ‘‘‘
 8 functools.wraps()相当于保留元信息
 9 说白了就是,如果不加这个装饰器,那么你打印detail的__name__它就是inner了,
10 因为加了装饰器,效果等同于inner=inner(detail()),
11 如果在装饰器中加了functools这个装饰器,那么相当于给__name__重新赋值,inner.__name__ = func.__name_-
12 其函数的名字得以保留。
13 ‘‘‘
14 
15 @wapper
16 def detail():
17     pass
18 
19 print(detail.__name__)

flask的get_flashed_messages,flash

 1 from flask import Flask,get_flashed_messages,flash
 2 app = Flask(__name__)
 3 app.secret_key = asdf
 4 @app.route(/get)
 5 def get():
 6     data = get_flashed_messages()
 7     print(data)
 8     return Hello world
 9 
10 @app.route(/set)
11 def set():
12     flash(info info)
13     ‘‘‘
14     闪现效果,相当于set视图函数执行2次,会在一个列表中存储两个flash函数的内容,
15     当执行get_flashed_messages的时候则会取出该列表,并清空,类似字典的Pop。
16     具体用处不大。。。
17     ‘‘‘
18     return Hello world
19 
20 if __name__ == __main__:
21     app.run()

flash还可以通过category参数给Flash内容归类,通过不同类别取不同内容。

 

以上是关于Flask 给视图函数增加装饰器的主要内容,如果未能解决你的问题,请参考以下文章

给每个flask接口增加验证调用装饰器

给每个flask接口增加验证调用装饰器

Flask视图:视图函数,类视图,蓝图使用方法整理

Flask类视图

Flask特殊装饰器

Flask--路由, 配置, 蓝图