我想在执行每个视图的代码之前使用get_flashed_messages()清理会话闪存。这是因为flash在会话中是持久的,这是非常不幸的(例如,如果在身份验证过程中未打印出闪烁的消息,则它们会在使用布局的第一页中立即全部打印出来)。
因此,我想在应用程序中的每个视图之前运行代码以清除会话刷新消息。
诸如before_request或before_app_request之类的功能将无法正确执行,因为它们在请求期间被执行了很多次(它们针对上载的每个模板或静态文件执行),并且这会擦除在视图代码中闪烁的消息(我只想在当前视图开始运行之前从其他视图中删除保留的消息)。
简而言之,我希望某些代码在调用每个视图函数之前只能运行一次,并且只能运行一次。
在Flask中有可能吗?
答案 0 :(得分:1)
是否在蓝图上使用before_request
钩子?这只会影响蓝图视图。
before_request(f)
就像Flask.before_request()一样,但是要有一个蓝图。该功能仅在该蓝图功能处理的每个请求之前执行。
更新
我尝试如下代码:
app.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
views / 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
。那么,这是您想要的吗?
答案 1 :(得分:0)
如果这是常用功能,则可以使用wraps
中的functools
编写装饰器。确保将装饰器写在app.route装饰器下面。
答案 2 :(得分:0)
来源:https://flask.palletsprojects.com/en/1.1.x/templating/
要将新变量自动注入到模板的上下文中,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) }}