Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Flask中,是否有方法在每次查看之前运行一些代码?_Python_Flask - Fatal编程技术网

Python 在Flask中,是否有方法在每次查看之前运行一些代码?

Python 在Flask中,是否有方法在每次查看之前运行一些代码?,python,flask,Python,Flask,在执行每个视图的代码之前,我想使用get_flashed_messages()清理会话闪存。这是因为flash在会话中是持久的,这是非常不幸的(例如,如果在身份验证过程中没有打印flash消息,那么它们会在使用布局的第一页中一次打印完) 因此,我希望在应用程序中的每个视图之前运行代码,以清除会话中闪现的消息 像before_request或before_app_request这样的函数不会正确执行,因为它们在请求过程中会执行多次(它们针对每个上传的模板或静态文件执行),这会擦除视图代码中闪现的消

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

因此,我希望在应用程序中的每个视图之前运行代码,以清除会话中闪现的消息

像before_request或before_app_request这样的函数不会正确执行,因为它们在请求过程中会执行多次(它们针对每个上传的模板或静态文件执行),这会擦除视图代码中闪现的消息(我只想在当前视图开始运行之前,从其他视图中删除保留的消息)

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


这在Flask中可能吗?

如果这是一个常用功能,您可以使用
functools
中的
wrapps
编写装饰程序。确保将装饰程序写入app.route装饰程序下方。

如果这是一个常用功能,您可以使用
functools
中的
wrapps
编写装饰程序。确保写入e app.route decorator下面的decorator。

如果在blueprint上的请求之前使用
钩子?这只会影响blueprint视图

请求前(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
视图/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\u func
一次。那么,这就是你想要的吗?

如果在蓝图上使用
before\u 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
视图/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
中的每个请求在\u func
之前只执行一次。那么,这就是您想要的吗?

来源:

要将新变量自动注入模板的上下文,Flask中存在上下文处理器。上下文处理器在呈现模板之前运行,并能够将新值注入模板上下文。上下文处理器是一个返回字典的函数。然后,此字典的键和值将与在模板上下文中,对于应用程序中的所有模板:

@app.context_processor
def inject_user():
    return dict(user=g.user)
上面的上下文处理器使名为user的变量在值为g.user的模板中可用。这个例子并不有趣,因为g在模板中无论如何都是可用的,但它给出了如何工作的想法

变量不限于值;上下文处理器还可以使函数对模板可用(因为Python允许传递函数):

上面的上下文处理器使format_price函数可用于所有模板:

{{ format_price(0.33) }}
资料来源:

要将新变量自动注入模板的上下文,Flask中存在上下文处理器。上下文处理器在呈现模板之前运行,并能够将新值注入模板上下文。上下文处理器是一个返回字典的函数。然后,此字典的键和值将与在模板上下文中,对于应用程序中的所有模板:

@app.context_processor
def inject_user():
    return dict(user=g.user)
上面的上下文处理器使名为user的变量在值为g.user的模板中可用。这个例子并不有趣,因为g在模板中无论如何都是可用的,但它给出了如何工作的想法

变量不限于值;上下文处理器还可以使函数对模板可用(因为Python允许传递函数):

上面的上下文处理器使format_price函数可用于所有模板:

{{ format_price(0.33) }}

嗨!好吧,那会有用的…但是我必须在平台中的每个视图上方编写装饰程序。我正在寻找一个更像请求之前的钩子。嗨!好吧,那会有用…但是我必须在平台中的每个视图上方编写装饰程序。我正在寻找一个更像请求之前的钩子。我已经尝试过了。没有Less调用了多次。我不知道为什么,但是flask在返回视图之前对同一个蓝图发出了很多请求。我认为这至少部分是因为flask_登录。因此,我需要对每个视图运行一次并且只运行一次的东西,而不是请求。我已经尝试过了。它仍然被调用了多次。我不知道为什么,但是flask在返回视图之前会对同一个蓝图发出很多请求。我认为这至少部分是因为flask\u登录。因此,我需要对每个视图运行一次且只运行一次的东西,而不是请求。这恰好对我在请求之前所做的另一件事很有用。上下文处理器似乎更适合使用case、 这恰好对我在请求之前所做的另一件事很有用。上下文处理器似乎更适合该用例。