Flask框架實現給檢視函式增加裝飾器操作示例
阿新 • • 發佈:2019-01-07
在@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__)
|