亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Flask 中,有沒有辦法在每個視圖之前運行一些代碼?

在 Flask 中,有沒有辦法在每個視圖之前運行一些代碼?

斯蒂芬大帝 2022-05-11 16:29:48
我想在執行每個視圖的代碼之前使用 get_flashed_messages() 清理會話閃存。那是因為 flash 在 session 中是持久的,這是非常不幸的(如果 flashed 消息沒有在身份驗證過程中打印,例如,它們會在使用布局的第一頁中一次全部打印出來)。所以,我想在應用程序中的每個視圖之前運行代碼來清理會話閃爍的消息。像 before_request 或 before_app_request 這樣的函數不會做對,因為它們在請求期間被執行了很多次(它們為每個正在上傳的模板或靜態文件執行),這會刪除視圖代碼中閃爍的消息(我只是想要在當前視圖開始運行之前從其他視圖中刪除持久化的消息)。簡單地說,我希望一些代碼在調用每個視圖函數之前運行一次,并且只運行一次。這在 Flask 中可行嗎?
查看完整描述

3 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

來源:https ://flask.palletsprojects.com/en/1.1.x/template/


為了將新變量自動注入到模板的上下文中,Flask 中存在上下文處理器。上下文處理器在模板渲染之前運行,并且能夠將新值注入到模板上下文中。上下文處理器是一個返回字典的函數。對于應用程序中的所有模板,此字典的鍵和值隨后與模板上下文合并:


@app.context_processor

def inject_user():

    return dict(user=g.user)

上面的上下文處理器使名為 user 的變量在模板中可用,其值為 g.user。這個例子不是很有趣,因為 g 無論如何都可以在模板中使用,但它給出了它是如何工作的一個想法。


變量不限于值;上下文處理器還可以使函數對模板可用(因為 Python 允許傳遞函數):


@app.context_processor

def utility_processor():

    def format_price(amount, currency=u'€'):

        return u'{0:.2f}{1}'.format(amount, currency)

    return dict(format_price=format_price)

上面的上下文處理器使 format_price 函數可用于所有模板:


{{ format_price(0.33) }}


查看完整回答
反對 回復 2022-05-11
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

如果使用before_request藍圖上的鉤子?這應該只會影響藍圖視圖。


before_request(f)

與 Flask.before_request() 類似,但用于藍圖。此函數僅在該藍圖的函數處理的每個請求之前執行。


參考:https ://flask.palletsprojects.com/en/1.1.x/api/?highlight=before_request#flask.Blueprint.before_request


更新


我嘗試一些代碼如下:


應用程序.py


from flask import Flask

from app.ext import db, login_manager


def create_app():

    app = Flask(__name__)

    app.config.from_object(config)

    db.init_app(app)

    login_manager.init_app(app)

    # blueprints

    register_blueprints('app.views', app)

    return app

意見/myview.py


from flask import (

    Blueprint, render_template,

    flash, get_flashed_messages

)

from flask_login import login_required


bp = Blueprint('myview', __name__, url_prefix='/myview')



@bp.before_request

def before_func():

    print(get_flashed_messages())

    print('---------------')



@bp.route('/index', methods=['GET'])

@login_required

def index():

    flash('Now in index')

    return render_template('index.html')



@bp.route('/home', methods=['GET'])

@login_required

def home():

    flash('Now in home')

    return render_template('home.html')

當我運行代碼時。每個請求只myview執行before_func一次。那么,這是你想要的嗎?


查看完整回答
反對 回復 2022-05-11
?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

如果是常用功能,可以使用wrapsfrom編寫裝飾器functools。確保在 app.route 裝飾器下方編寫裝飾器。



查看完整回答
反對 回復 2022-05-11
  • 3 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號