視圖示例
@app.route('/hello') def hello(): return 'Hello World' if __name__ == '__main__': app.run()
特殊的裝飾器
1. before_request # 在全部視圖函數執行前執行 2. after_request # 在全部視圖函數執行後執行 示例: from flask import Flask app = Flask(__name__) @app.before_request def x1(): print('before:x1') return '滾' @app.before_request def xx1(): print('before:xx1') @app.after_request def x2(response): print('after:x2') return response @app.after_request def xx2(response): print('after:xx2') return response @app.route('/index') def index(): print('index') return "Index" @app.route('/order') def order(): print('order') return "order" if __name__ == '__main__': app.run() 3. before_first_request # 在視圖函數第一次執行以前執行,只執行一次 from flask import Flask app = Flask(__name__) @app.before_first_request def x1(): print('123123') @app.route('/index') def index(): print('index') return "Index" @app.route('/order') def order(): print('order') return "order" if __name__ == '__main__': app.run() 4. template_global # 定義全局的函數 能夠被任意模板調用 5. template_filter # 定義一個模板filter 6. errorhandler # 頁面錯誤的時候會執行此函數 @app.errorhandler(404) def not_found(arg): print(arg) return "沒找到"
給視圖函數加裝飾器的注意事項
若是按照正常的寫法直接在視圖函數上加裝飾器@wrapper,則會報錯,這是由於加完裝飾器以後,原函數名就改變了。html
報錯信息:python
AssertionError: View function mapping is overwriting an existing endpoint function: inner
在@app.route的狀況下增長裝飾器的寫法:django
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()
另外一種寫法:flask
import functools def 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_- 其函數的名字得以保留。 ''' @wapper def detail(): pass print(detail.__name__)
flask的get_flashed_messages,flashsession
from flask import Flask,get_flashed_messages,flash app = 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()
flash還能夠經過category參數給Flash內容歸類,經過不一樣類別取不一樣內容。app