基于子域名路由的Flask应用

17 投票
1 回答
11017 浏览
提问于 2025-04-17 02:49

我想把我的主域名当作一个门户网站,用来链接到不同的子域名,这些子域名对应我网站的不同部分。比如说,example.com 应该指向一个 welcome.html 的模板页面。而 eggs.example.com 则应该指向网站的一个“鸡蛋”子部分或应用。请问我该如何在 Flask 中实现这个功能呢?

1 个回答

37

@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,这样子域名才能指向和基础域名相同的主机,并且要配置网络服务器,把所有这些名称都路由到你的应用上。

记住,所有的 Flask 路由其实都是 werkzeug.routing.Rule 的实例。查看 Werkzeug 对 Rule 的文档,你会发现很多路由可以做的事情,而这些在 Flask 的文档中没有详细说明(因为这些已经在 Werkzeug 中有很好的文档了)。

撰写回答