1. 程式人生 > >Flask框架實現給檢視函式增加裝飾器操作示例

Flask框架實現給檢視函式增加裝飾器操作示例

@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__)