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 给视图函数增加装饰器的主要内容,如果未能解决你的问题,请参考以下文章