在 Flask 中,有没有办法在每个视图之前运行一些代码?

我想在执行每个视图的代码之前使用 get_flashed_messages() 清理会话闪存。那是因为 flash 在 session 中是持久的,这是非常不幸的(如果 flashed 消息没有在身份验证过程中打印,例如,它们会在使用布局的第一页中一次全部打印出来)。

所以,我想在应用程序中的每个视图之前运行代码来清理会话闪烁的消息。

像 before_request 或 before_app_request 这样的函数不会做对,因为它们在请求期间被执行了很多次(它们为每个正在上传的模板或静态文件执行),这会删除视图代码中闪烁的消息(我只是想要在当前视图开始运行之前从其他视图中删除持久化的消息)。

简单地说,我希望一些代码在调用每个视图函数之前运行一次,并且只运行一次。

这在 Flask 中可行吗?


斯蒂芬大帝
浏览 226回答 3
3回答

慕标5832272

来源:https ://flask.palletsprojects.com/en/1.1.x/template/为了将新变量自动注入到模板的上下文中,Flask 中存在上下文处理器。上下文处理器在模板渲染之前运行,并且能够将新值注入到模板上下文中。上下文处理器是一个返回字典的函数。对于应用程序中的所有模板,此字典的键和值随后与模板上下文合并:@app.context_processordef inject_user():    return dict(user=g.user)上面的上下文处理器使名为 user 的变量在模板中可用,其值为 g.user。这个例子不是很有趣,因为 g 无论如何都可以在模板中使用,但它给出了它是如何工作的一个想法。变量不限于值;上下文处理器还可以使函数对模板可用(因为 Python 允许传递函数):@app.context_processordef 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) }}

缥缈止盈

如果使用before_request蓝图上的钩子?这应该只会影响蓝图视图。before_request(f)与 Flask.before_request() 类似,但用于蓝图。此函数仅在该蓝图的函数处理的每个请求之前执行。参考:https ://flask.palletsprojects.com/en/1.1.x/api/?highlight=before_request#flask.Blueprint.before_request更新我尝试一些代码如下:应用程序.pyfrom flask import Flaskfrom app.ext import db, login_managerdef 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.pyfrom flask import (    Blueprint, render_template,    flash, get_flashed_messages)from flask_login import login_requiredbp = Blueprint('myview', __name__, url_prefix='/myview')@bp.before_requestdef before_func():    print(get_flashed_messages())    print('---------------')@bp.route('/index', methods=['GET'])@login_requireddef index():    flash('Now in index')    return render_template('index.html')@bp.route('/home', methods=['GET'])@login_requireddef home():    flash('Now in home')    return render_template('home.html')当我运行代码时。每个请求只myview执行before_func一次。那么,这是你想要的吗?

慕码人8056858

如果是常用功能,可以使用wrapsfrom编写装饰器functools。确保在 app.route 装饰器下方编写装饰器。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python