Я хочу, чтобы мой домен верхнего уровня был порталом для различных поддоменов, соответствующих разным разделам моего сайта. example.com
должен перенаправляться на шаблон welcome.html
. eggs.example.com
должен перенаправляться в подраздел "яйца" или приложение сайта. Как мне добиться этого в Flask?
Приложение 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 вашего компьютера (/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, чтобы субдомены направлялись к тому же хосту, что и базовое имя, и настроить веб-сервер для маршрутизации всех этих имен в приложение.
Помните, что все маршруты Flask на самом деле являются экземплярами werkzeug.routing.Rule
. Изучив документацию Werkzeug для Rule
, вы узнаете немало вещей, которые маршрутизируют может сделать так, что документация Flask замалчивается (поскольку она уже хорошо задокументирована Werkzeug).