基于子域名路由的Flask应用
我想把我的主域名当作一个门户网站,用来链接到不同的子域名,这些子域名对应我网站的不同部分。比如说,example.com
应该指向一个 welcome.html
的模板页面。而 eggs.example.com
则应该指向网站的一个“鸡蛋”子部分或应用。请问我该如何在 Flask 中实现这个功能呢?
1 个回答
@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:5000
,http://eggs.example.com:5000
等等。
同样,当你把应用部署到生产环境时,你需要配置 DNS,这样子域名才能指向和基础域名相同的主机,并且要配置网络服务器,把所有这些名称都路由到你的应用上。
记住,所有的 Flask 路由其实都是 werkzeug.routing.Rule
的实例。查看 Werkzeug 对 Rule
的文档,你会发现很多路由可以做的事情,而这些在 Flask 的文档中没有详细说明(因为这些已经在 Werkzeug 中有很好的文档了)。