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內容歸類,通過不同類別取不同內容。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM