Приложение Flask, которое маршрутизирует на основе поддоменов

Я хочу иметь свой домен верхнего уровня в качестве портала для различных поддоменов, которые соответствуют различным разделам моего сайта. example.com должен welcome.html шаблону 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 вашего компьютера (/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).