3 回答

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

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一次。那么,這是你想要的嗎?
添加回答
舉報