如何根据请求的URL的域在Flask中路由?

时间:2015-02-16 14:56:51

标签: routing flask elastic-beanstalk

我正在尝试基于我正在构建的Flask网站所请求的URL的主机实现路由。

根据我读过hereelsewhere的内容,似乎可以使用

这样的内容
from flask import Flask
application = Flask(__name__)

application.url_map.host_matching = True

@application.route("/", host="<prefix>.mydomain.com:<port>")
def mydomain(prefix='', port=0, **kwargs):
    return 'This is My Domain: with prefix  ' + prefix

@application.route("/", host="<prefix>.<project>elasticbeanstalk.com:<port>")
def test(prefix='', project='', port=0, **kwargs):
    return 'You are reading from EB  ' + project

@application.route("/", host="<host>:<port>")
def catchall(**kwargs):
    return 'This is anything'

但这失败了404“页面未找到”。还有什么我需要做才能让这个工作?链接的SO answer提到“当你将host_matching设置为true时需要为所有路由指定主机”,但我不确定这意味着什么或它看起来像什么(我认为这就是我上面做过的事情) )。

如何根据请求的网址在Flask中路由?


如果重要,此站点托管在AWS Elastic Beanstalk上。

1 个答案:

答案 0 :(得分:4)

调试这些情况的一种方法是跳转到控制台并使用底层函数:

>>> from werkzeug.routing import Map, Rule
>>> m = Map([Rule('/', endpoint='endpoint', host='<host>.example.com:<port>')], host_matching=True)
>>> c = m.bind('open.example.com:888')
>>> c.match('/')
('endpoint', {'host': u'open', 'port': u'888'})

如果它不匹配则会引发NotFound异常。

您可以在一行上运行该命令

>>> Map([Rule('/', endpoint='endpoint', host='<host>.example.com:<port>')], host_matching=True).bind('open.example.com:888').match('/')

获得一个关于你做错了什么的快速反馈循环。我能从代码示例中得出的唯一一点是实际的主机字符串是什么样的......这是重要的部分。这就是您需要了解的信息,并提供给m.bind电话。因此,如果您能告诉我在您的特定情况下主机字符串是什么样的,我绝对可以为您调试。

您提供的示例主机字符串是:www.myproject-elasticbeanstalk.com。

>>> Map([Rule('/', endpoint='endpoint', host='<prefix>.<project>-elasticbeanstalk.com')], host_matching=True).bind('www.myproject-elasticbeanstalk.com').match('/')
('endpoint', {'prefix': u'www', 'project': u'myproject'})

因此,'<prefix>.<project>-elasticbeanstalk.com'的修改后的主机字符串与之匹配,并将前缀和项目传递到视图中。也许只是当主机字符串不包含端口号时,您是否尝试匹配端口号?