在将我的应用程序移动到托管在子目录中时,我很难找到设置我的烧瓶路线的正确方法。我已经阅读了关于这个主题的一些很好的答案,最值得注意的是this answer为所有路由添加前缀。但是,我认为我的情况略有不同。我想只使用url_for
生成的网址前缀,而不是回复这些网址。有没有办法做到这一点?
例如,假设我的烧瓶应用程序托管在http://www.acme.com/tools/
。主acme.com
域设置了代理传递,以将/tools/*
的所有请求传递到我的应用。因此,即使完整网址为/
/等,我的应用也会看到/product_1/
,http://www.acme.com/tools/product_
等请求。因此,我的app.route
规则可以使用/
作为基本路线。问题是我在任何地方使用url_for
,我希望生成的网址是/tools/product_1
,不 /product_1
等完整网址。有没有办法实现这个目标?
我尝试过使用蓝图,但这些会使@app.route
和url_for
回复/tools/xyz
。是否有一个更简单的解决方案来解决这个问题,或者这是处理这个问题的非标准方法吗?
答案 0 :(得分:1)
我会看一下这段代码:http://flask.pocoo.org/snippets/35/
我不确定我是否喜欢将您的WSGI环境修改为此问题的唯一解决方案。你总是可以包装url_for。 (请注意,这不适用于_external=True
)
def my_url_for(*args, **kwargs):
return '/tools' + url_for(*args, **kwargs)
请务必将APPLICATION_ROOT
设置为/tools
,以便只能从应用访问Cookie。
答案 1 :(得分:1)
我找到了一种不同的方法来处理这个问题而无需为url_for
提供包装器。我使用自定义路由规则来附加前缀。这意味着不必更改app.route
装饰器调用,并且对url_for
的所有调用都将自动添加前缀。通过覆盖url_rule_class
?
在设置应用后,将以下内容添加到__init__.py
。
from werkzeug.routing import Rule
class PrefixRule(Rule):
def build(self, *args, **kwargs):
domain_part, url = super(PrefixRule, self).build(*args, **kwargs)
return domain_part, u'%s%s' % (app.config['PREFIX'], url)
app.url_rule_class = PrefixRule