Python 在Flask中,是否有方法在每次查看之前运行一些代码?
在执行每个视图的代码之前,我想使用get_flashed_messages()清理会话闪存。这是因为flash在会话中是持久的,这是非常不幸的(例如,如果在身份验证过程中没有打印flash消息,那么它们会在使用布局的第一页中一次打印完) 因此,我希望在应用程序中的每个视图之前运行代码,以清除会话中闪现的消息 像before_request或before_app_request这样的函数不会正确执行,因为它们在请求过程中会执行多次(它们针对每个上传的模板或静态文件执行),这会擦除视图代码中闪现的消息(我只想在当前视图开始运行之前,从其他视图中删除保留的消息) 简单地说,我希望一些代码在调用每个视图函数之前运行一次,而且只运行一次Python 在Flask中,是否有方法在每次查看之前运行一些代码?,python,flask,Python,Flask,在执行每个视图的代码之前,我想使用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、 这恰好对我在请求之前所做的另一件事很有用。上下文处理器似乎更适合该用例。