使用Flask使用自定义域的路由

时间:2013-11-06 04:05:44

标签: python flask subdomain werkzeug

我的网络应用为用户分配子域,并可选择允许他们使用自定义域。除非用户访问其路径的自定义域而不包含尾部斜杠,否则此方法有效。

对此网址的GET请求按预期工作:http://user.example.com:5000/book/12345/

对此网址的GET请求按预期工作:http://custom.com:5000/book/12345/

请求此网址的请求尝试重定向,但失败:http://custom.com:5000/book/12345

Flask最终将浏览器重定向到此网址,当然,这不起作用:http://<invalid>.example.com:5000/book/12345/

我应该采用不同的方式处理自定义域吗?这是重现这一点的完整最小例子。我已经设置了custom.com,example.com。和user.example.com在我的开发环境的/ etc / hosts文件中指向127.0.0.1,以便Flask收到请求。

from flask import Flask

app = Flask(__name__)

server = app.config['SERVER_NAME'] = 'example.com:5000'

@app.route('/', subdomain="<subdomain>")
@app.route('/')
def index(subdomain=None):

    return ("index")

@app.route('/book/<book_id>/', subdomain="<subdomain>")
@app.route('/book/<book_id>/')
def posts(post_id, subdomain=None):

    return (book_id)


if __name__ == '__main__':
    app.run(host='example.com', debug=True)

1 个答案:

答案 0 :(得分:2)

我不确定这是可能的。主机匹配和子域匹配是mutually exclusive(查看主机匹配参数)。

但我喜欢错。

我能想到的解决这个问题的一种方法是在Flask(比如nginx)前面使用一些指向custom.comcustom.com._custom.example.com或类似的东西。在您的代码中,您可以创建一个自定义url_for函数,将其识别为自定义域。我会问Flask mailing list因为他们能够给你一个坚实的答案。