【问题标题】:url_for Builderror in flask extension with pluggable views带有可插入视图的烧瓶扩展中的 url_for Builderror
【发布时间】:2012-11-12 13:58:03
【问题描述】:

我正在为烧瓶构建一个简单的扩展,并且 url_for 函数无法在扩展中构建 url。

有人可以帮我弄清楚我在这里缺少什么吗?

我简化了代码来演示问题(所有 url_for 调用都会引发 werkzeug BuildError 异常):

import flask
import flask.views

import logging
logging.basicConfig(level=logging.DEBUG)

class MyFlaskExt(object):
    def __init__(self, app=None):
        if app is not None:
            self.init_app(app)

    def init_app(self, app):
        self.blueprint = flask.Blueprint('myext', __name__, static_folder='static', template_folder='templates')
        self.blueprint.add_url_rule('/', view_func=RootView.as_view('root'), endpoint='root')
        self.blueprint.add_url_rule('/var/<somevar>', view_func=VarView.as_view('var'), endpoint='var')
        self.blueprint.add_url_rule('/novar', view_func=NoVarView.as_view('novar'), endpoint='novar')
        app.register_blueprint(self.blueprint)


class RootView(flask.views.View):
    def dispatch_request(self):
        logging.debug(flask.url_for('novar'))
        logging.debug(flask.url_for('novar', _external=True))
        return flask.redirect(flask.url_for('var', somevar='test'))

class VarView(flask.views.View):
    def dispatch_request(self, somevar):
        return "SUCCESS! ({})".format(somevar)

class NoVarView(flask.views.View):
    def dispatch_request(self):
        return "SUCCESS!"

if __name__ == '__main__':
    app = flask.Flask(__name__)
    app.debug = True
    my_ext = MyFlaskExt()
    my_ext.init_app(app)
    logging.debug(app.url_map)
    app.run()

【问题讨论】:

    标签: python flask flask-extensions


    【解决方案1】:

    Blueprint 端点注册在Blueprint 的名称下。如果我没记错的话,您要么需要在 url_for 呼叫前加上“。” (如果它们都将在同一个蓝图下运行)或使用全名:

    def dispatch_request(self):
        logging.debug(flask.url_for('.novar'))
        logging.debug(flask.url_for('.novar', _external=True))
        return flask.redirect(flask.url_for('.var', somevar='test'))
    

    【讨论】:

    • 具有讽刺意味的是,您的修复适用于我的示例,但不适用于我的真实代码...现在我只需要找出我在简化时遗漏了什么;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2013-07-26
    • 2023-03-21
    • 2012-06-16
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多