在Flask中,是否可以在每个视图之前运行一些代码?

时间:2019-08-26 20:34:45

标签: python flask

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

因此,我想在应用程序中的每个视图之前运行代码以清除会话刷新消息。

诸如before_request或before_app_request之类的功能将无法正确执行,因为它们在请求期间被执行了很多次(它们针对上载的每个模板或静态文件执行),并且这会擦除在视图代码中闪烁的消息(我只想在当前视图开始运行之前从其他视图中删除保留的消息)。

简而言之,我希望某些代码在调用每个视图函数之前只能运行一次,并且只能运行一次。

在Flask中有可能吗?

3 个答案:

答案 0 :(得分:1)

是否在蓝图上使用before_request钩子?这只会影响蓝图视图。

  

before_request(f)
  就像Flask.before_request()一样,但是要有一个蓝图。该功能仅在该蓝图功能处理的每个请求之前执行。

引用:https://flask.palletsprojects.com/en/1.1.x/api/?highlight=before_request#flask.Blueprint.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) }}