本文實例講述了Flask框架實現給視圖函數增加裝飾器操作。分享給大家供大家參考,具體如下:
在@app.route
的情況下增加裝飾器的寫法:
from flask import Flask,request,render_template,redirect,session,url_for,viewsfrom flask import render_templateapp = 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的namedef 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')@wapperdef detail(nid): print(nid) return render_template('hello.html')'''如果給一個視圖函數增加裝飾器,應該加在app.route下面,這樣的效果就是,裝飾器將下面的所有內容包裹,然后路由對應到這大的包裹中來。需要注意endpoint要注明,如果不注明endpoint則默認用函數名來定義,此時所有的函數名都叫inner了,所以需要注明endpoint,只是為了區分。'''if __name__ == '__main__': app.run()
另一種寫法:
import functoolsdef wapper(func): @functools.wraps(func) def inner(*args,**kwargs): return func(*args,**kwargs) return inner'''functools.wraps()相當于保留元信息說白了就是,如果不加這個裝飾器,那么你打印detail的__name__它就是inner了,因為加了裝飾器,效果等同于inner=inner(detail()),如果在裝飾器中加了functools這個裝飾器,那么相當于給__name__重新賦值,inner.__name__ = func.__name_-其函數的名字得以保留。'''@wapperdef detail(): passprint(detail.__name__)
flask的get_flashed_messages,flash
from flask import Flask,get_flashed_messages,flashapp = Flask(__name__)app.secret_key = 'asdf'@app.route('/get')def get(): data = get_flashed_messages() print(data) return 'Hello world'@app.route('/set')def set(): flash('info info') ''' 閃現效果,相當于set視圖函數執行2次,會在一個列表中存儲兩個flash函數的內容, 當執行get_flashed_messages的時候則會取出該列表,并清空,類似字典的Pop。 具體用處不大。。。 ''' return 'Hello world'if __name__ == '__main__': app.run()
新聞熱點
疑難解答