Маршруты с пользовательскими доменами с использованием Flask
Мое веб-приложение назначает поддомен пользователям и, при желании, позволяет им использовать собственный домен. Это работает, за исключением случаев, когда пользователь посещает свой пользовательский домен для маршрута без включающей косой черты.
GET-запросы к этому URL-адресу работают как положено: http://user.example.com:5000/book/12345/
GET-запросы к этому URL-адресу работают как положено: http://custom.com:5000/book/12345/
Получите запросы на этот URL-адрес попытки перенаправить, но не удается: http://custom.com:5000/book/12345
Flask в конечном итоге перенаправляет браузер на этот URL, который, конечно, не работает: http://<invalid>.example.com:5000/book/12345/
Есть ли другой способ обработки пользовательских доменов? Вот полный минимальный пример, чтобы воспроизвести это. Я установил custom.com, example.com. и user.example.com, чтобы указать 127.0.0.1 в моем файле /etc/hosts в моей среде разработки, чтобы Flask получил запрос.
from flask import Flask
app = Flask(__name__)
server = app.config['SERVER_NAME'] = 'example.com:5000'
@app.route('/', subdomain="<subdomain>")
@app.route('/')
def index(subdomain=None):
return ("index")
@app.route('/book/<book_id>/', subdomain="<subdomain>")
@app.route('/book/<book_id>/')
def posts(post_id, subdomain=None):
return (book_id)
if __name__ == '__main__':
app.run(host='example.com', debug=True)
1 ответ
Я не уверен, что это возможно. сопоставление хоста и сопоставление поддоменов являются взаимоисключающими (посмотрите на параметр сопоставления хоста).
Я бы хотел быть неправым.
Один из способов обойти эту проблему, о котором я могу подумать, - это использовать что-то перед Flask (скажем, nginx), которое указывает custom.com
в custom.com._custom.example.com
или что-то типа того. В своем коде вы можете создать кастом url_for
функция, которая распознает это как пользовательский домен. Я бы спросил в списке рассылки Flask, чтобы они могли дать вам исчерпывающий ответ.