为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

斯蒂芬大帝 2022-05-11 16:29:48
我想在执行每个视图的代码之前使用 get_flashed_messages() 清理会话闪存。那是因为 flash 在 session 中是持久的,这是非常不幸的(如果 flashed 消息没有在身份验证过程中打印,例如,它们会在使用布局的第一页中一次全部打印出来)。所以,我想在应用程序中的每个视图之前运行代码来清理会话闪烁的消息。像 before_request 或 before_app_request 这样的函数不会做对,因为它们在请求期间被执行了很多次(它们为每个正在上传的模板或静态文件执行),这会删除视图代码中闪烁的消息(我只是想要在当前视图开始运行之前从其他视图中删除持久化的消息)。简单地说,我希望一些代码在调用每个视图函数之前运行一次,并且只运行一次。这在 Flask 中可行吗?
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

来源:https ://flask.palletsprojects.com/en/1.1.x/template/


为了将新变量自动注入到模板的上下文中,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) }}


查看完整回答
反对 回复 2022-05-11
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

如果使用before_request蓝图上的钩子?这应该只会影响蓝图视图。


before_request(f)

与 Flask.before_request() 类似,但用于蓝图。此函数仅在该蓝图的函数处理的每个请求之前执行。


参考:https ://flask.palletsprojects.com/en/1.1.x/api/?highlight=before_request#flask.Blueprint.before_request


更新


我尝试一些代码如下:


应用程序.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_func一次。那么,这是你想要的吗?


查看完整回答
反对 回复 2022-05-11
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

如果是常用功能,可以使用wrapsfrom编写装饰器functools。确保在 app.route 装饰器下方编写装饰器。



查看完整回答
反对 回复 2022-05-11
  • 3 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号