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一次。那么,这是你想要的吗?
添加回答
举报
