在@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__)
|