溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-09 13:19:59 來源:腳本之家 閱讀:162 作者:鎧甲巨人 欄目:開發技術

本文實例講述了Flask框架實現給視圖函數增加裝飾器操作。分享給大家供大家參考,具體如下:

@app.route的情況下增加裝飾器的寫法:

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()

另一種寫法:

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,flash

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

更多關于Python相關內容可查看本站專題:《Python入門與進階經典教程》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》及《Python文件與目錄操作技巧匯總》

希望本文所述對大家Python程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女