使用Flask蓝图,如果指定了子域,如何修复url_for?

时间:2012-05-10 21:35:33

标签: python routes flask

在烧瓶蓝图中,我有:

frontend = Blueprint('frontend', __name__)

和我的索引功能的路线是:

@frontend.route('/')
def index():
  #code

这很好但是,我试图在路径中添加一个子域,如下所示:

@frontend.route('/', subdomain='<var>')
def index(var):

但这打破了应用程序并且浏览器吐出(除其他外):

werkzeug.routing.BuildError
BuildError: ('frontend.index', {}, None)

frontend.index在我的代码中在 url_for('frontend.index')的几个地方调用

当我包含子域时,如何让url_for工作?在http://flask.pocoo.org/docs/api/

下,我能找到的文件中唯一可能与之相关的内容可能是相关的
  

为了集成应用程序,Flask有一个拦截URL构建的钩子   Flask.build_error_handler出错。 url_for函数结果   当前应用程序没有给定的URL时,在BuildError中   端点和值。当它发生时,current_app会调用它   build_error_handler如果不是None,可以返回一个字符串   使用url_for的结果(而不是url_for的默认值   BuildError异常)或重新引发异常。一个例子:

def external_url_handler(error, endpoint, **values):
    "Looks up an external URL when `url_for` cannot build a URL."
    # This is an example of hooking the build_error_handler.
    # Here, lookup_url is some utility function you've built
    # which looks up the endpoint in some external URL registry.
    url = lookup_url(endpoint, **values)
    if url is None:
        # External lookup did not have a URL.
        # Re-raise the BuildError, in context of original traceback.
        exc_type, exc_value, tb = sys.exc_info()
        if exc_value is error:
            raise exc_type, exc_value, tb
        else:
            raise error
    # url_for will use this result, instead of raising BuildError.
    return url

app.build_error_handler = external_url_handler

但是,我是python(和编程)的新手,并且无法理解我将放置此代码的位置,或者在发生builder错误时如何调用该函数。

非常感谢任何见解:)

3 个答案:

答案 0 :(得分:13)

首先,要使用子域名,您需要为SERVER_NAME configuration设置一个值:

app.config['SERVER_NAME'] = 'example.net'

你有这样的观点:

frontend = Blueprint('frontend', __name__)
@frontend.route('/', subdomain='<var>')
def index(var):
    return ...

为了重建此视图的URL,Flask需要 var 的值。 url_for('frontend.index')将失败,因为它没有足够的值。对于上述SERVER_NAME,url_for('frontend.index', var='foo')将返回http://foo.example.net/

答案 1 :(得分:9)

url_for中添加蓝图名称。例如:

url_for('pay_sermepa.sermepa_cancel', _external=True)
  • pay_sermepa:蓝图名称
  • sermepa_cancel:route

答案 2 :(得分:-3)

我不认为这是Flask的问题。

您提供了两个具有相同方法名称的函数:

@frontend.route('/')
def index():
  #code

@frontend.route('/', subdomain='<var>')
def index(var):

它们的包装方式不同,但是当调用flask.build_url时,由于函数名重载,它会抛出。 这看起来似乎不正确。

尝试为第二个提供不同的功能名称,如

@frontend.route('/', subdomain='<var>')
def index_var(var):

这可以解决您的问题。我虽然没有测试过它。