Flask框架实现给视图函数增加装饰器操作示例

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

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

另一种写法:

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

猜你喜欢

转载自www.cnblogs.com/fengchong/p/10235624.html
今日推荐