基于子域路由的Flask应用程序

问题描述 投票:12回答:1

我希望将我的顶级域名作为与我网站的不同部分对应的各种子域名的门户网站。 example.com应该路由到welcome.html模板。 eggs.example.com应该路由到“鸡蛋”小节或网站的应用。我如何在Flask中实现这一目标?

python google-app-engine flask url-routing werkzeug
1个回答
29
投票

@app.route()使用subdomain参数来指定路由匹配的子域。 Blueprint还使用subdomain参数为蓝图中的所有路径设置子域匹配。

您必须将app.config['SERVER_NAME']设置为基本域,以便Flask知道要匹配的内容。您还需要指定端口,除非您的应用程序在端口80或443上运行(即在生产中)。

从Flask 1.0开始,您还必须在创建应用程序对象时设置subdomain_matching=True

from flask import Flask

app = Flask(__name__, subdomain_matching=True)
app.config['SERVER_NAME'] = "example.com:5000"

@app.route("/")
def index():
    return "example.com"

@app.route("/", subdomain="eggs")
def egg_index():
    return "eggs.example.com"
ham = Blueprint("ham", __name__, subdomain="ham")

@ham.route("/")
def index():
    return "ham.example.com"

app.register_blueprint(ham)

在本地运行时,您需要编辑计算机的hosts文件(Unix上的/etc/hosts),以便它知道如何路由子域,因为域实际上并不存在于本地。

127.0.0.1 localhost example.com eggs.example.com ham.example.com

请记住仍然在浏览器中指定端口,http://example.com:5000http://eggs.example.com:5000等。

同样,在部署到生产环境时,您需要配置DNS以使子域路由到与基本名称相同的主机,并配置Web服务器以将所有这些名称路由到应用程序。

请记住,所有Flask路线都是werkzeug.routing.Rule的实例。咨询Werkzeug's documentation for Rule将向您展示Flask的文档掩盖的路线可以做的很多事情(因为Werkzeug已经很好地记录了它)。

© www.soinside.com 2019 - 2024. All rights reserved.