我想让我的顶级域作为对应于我网站不同部分的各种子域的门户。example.com
应该路由到welcome.html
模板。eggs.example.com
应该路由到站点的“eggs”子部分或应用程序。我将如何在 Flask 中实现这一点?
问问题
8770 次
1 回答
37
@app.route()
接受一个subdomain
参数来指定路由匹配的子域。Blueprint
还需要一个subdomain
参数来为蓝图中的所有路由设置子域匹配。
您必须设置app.config['SERVER_NAME']
为基本域,以便 Flask 知道要匹配什么。您还需要指定端口,除非您的应用程序在端口 80 或 443 上运行(即在生产中)。
从 Flask 1.0 开始,您还必须subdomain_matching=True
在创建 app 对象时进行设置。
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)
在本地运行时,您需要编辑计算机的主机文件(/etc/hosts
在 Unix 上),以便它知道如何路由子域,因为域实际上并不存在于本地。
127.0.0.1 localhost example.com eggs.example.com ham.example.com
请记住仍然在浏览器中指定端口http://example.com:5000
,, http://eggs.example.com:5000
, 等。
同样,在部署到生产环境时,您需要配置 DNS 以便子域路由到与基本名称相同的主机,并配置 Web 服务器以将所有这些名称路由到应用程序。
请记住,所有 Flask 路由实际上都是werkzeug.routing.Rule
. 查阅 Werkzeug的文档Rule
将向您展示路由可以做的很多事情,而 Flask 的文档掩盖了(因为 Werkzeug 已经很好地记录了它)。
于 2011-09-24T03:02:04.830 回答