具有代理传递的Flask的正确URL路由配置

时间:2016-03-17 16:22:15

标签: flask

在将我的应用程序移动到托管在子目录中时,我很难找到设置我的烧瓶路线的正确方法。我已经阅读了关于这个主题的一些很好的答案,最值得注意的是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.routeurl_for回复/tools/xyz。是否有一个更简单的解决方案来解决这个问题,或者这是处理这个问题的非标准方法吗?

2 个答案:

答案 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