Flask:在视图代码中获取Blueprint选项
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)。不过如果我重新写的话,我会尝试去掉元类。