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