Flask:在视图代码中获取Blueprint选项

1 投票
2 回答
760 浏览
提问于 2025-04-17 21:04

Flask中的蓝图功能让我在注册蓝图时可以传递一些可选的值。可是,之后我该怎么获取这些值呢?

from flask import Blueprint, g

bp = Blueprint('test', __name__, url_prefix='/test')

@bp.route('/')
def index():
    ... now where do I get the value of `foo` from? ...

app.register_blueprint(bp, foo="bar")

2 个回答

1

你传给 register_blueprint 的选项,最后会被传递给 werkzeug.routing.Rule,而在这个过程中似乎没有被存储到其他地方。

Rule 的构造函数 中可以看到,你提供的所有无关参数都会被丢弃。

class Rule(RuleFactory):
    def __init__(self, string, defaults=None, subdomain=None, methods=None,
                 build_only=False, endpoint=None, strict_slashes=None,
                 redirect_to=None, alias=False, host=None)

这意味着,如果你不创建一个子类来专门存储 foo,你可能无法成功访问它。

1

从我所看到的,传递给 register_blueprint 的选项主要是用来帮助 Flask 内部设置蓝图的,比如配置 URL 前缀、子域名等。这些选项在请求时是无法使用的。

也许你可以解释一下,为什么你想在请求中访问那个值呢?

你有没有考虑过使用可插拔视图呢?

http://flask.pocoo.org/docs/views/

通过视图,你可以继承 View 类,然后重写 __init__ 方法,把值传入,这样在请求中就可以使用这些值了。

你也可以继承 Blueprint 类,做同样的事情,只是这样代码会稍微多一些,复杂度也会增加。我在 这里 做过类似的事情(看看 BlueprintWrapper)。不过如果我重新写的话,我会尝试去掉元类。

撰写回答