Маршрутизация домена в Flask

Я хотел перенаправить пользователей с test1.domain.com на test2.domain.com. Я попробовал «host_matching» в url_map вместе с «host» в url_rule. Кажется, это не работает, показывает ошибку 404. Например, при посещении «localhost.com: 5000» он должен перейти на «test.localhost.com: 5000».

from flask import Flask, url_for, redirect
app = Flask(__name__)
app.url_map.host_matching = True

@app.route("/")
def hello1():
    #return "Hello @ example1!"
    return redirect(url_for('hello2'))

@app.route("/test/", host="test.localhost.com:5000")
def hello2():
    return "Hello @ test!"

if __name__ == "__main__":
    app.run()

Является ли это возможным? Кто-нибудь пробовал? Заранее спасибо..


person rajpy    schedule 29.08.2013    source источник
comment
Помогут ли ответы на этот вопрос в вашей ситуации? stackoverflow.com/questions/9766134/   -  person raddevon    schedule 29.08.2013


Ответы (1)


Ничто в вашем коде не перенаправляет запрос с localhost.com на test.localhost.com. Вам нужно будет ответить перенаправлением http на запросы localhost.com, если вы хотите, чтобы это произошло. Вам также необходимо указать хост для всех маршрутов, если для host_matching задано значение true .

from flask import Flask, redirect, url_for
app = Flask(__name__)
app.url_map.host_matching = True

@app.route("/", host="localhost.com:5000")
def hello1():
    return redirect(url_for("hello2")) # for permanent redirect you can do redirect(url_for("hello2"), 301)

@app.route("/", host="test.localhost.com:5000")
def hello2():
    return "Hello @ test!"

if __name__ == "__main__":
    app.run()

Имейте в виду, что вам также потребуется сопоставить localhost.com и test.localhost.com с 127.0.0.1 в вашем файле hosts.

person aychedee    schedule 29.08.2013
comment
Да .. Я пробовал перенаправить. Обновил мой вопрос. Ваше решение также не работает. Ты пробовал? маршрутизация поддоменов работает правильно, но не этот. - person rajpy; 29.08.2013
comment
Только что проверил и обновил, теперь работает. Вам также необходимо указать полный хост, включая номера портов. И перенаправление должно включать схему http://, чтобы функционировать. - person aychedee; 29.08.2013
comment
Он просто перенаправит на test.localhost.com:5000, это нормально, верно? Мы просто перенаправляем на другой сайт. - person rajpy; 29.08.2013
comment
Ok. Я заменил «return redirect(test.localhost.com:5000)' на redirect(url_for('hello2 ')) все заработало. Одна вещь, которую я пропустил, это «хост» в первом маршруте. Спасибо. - person rajpy; 29.08.2013
comment
В своем вопросе вы говорите, что при посещении «localhost.com: 5000» он должен перейти на «test.localhost.com: 5000». Для этого вы отправляете браузеру перенаправление. Затем он делает еще один запрос. Как еще вы ожидали, что это сработает? - person aychedee; 29.08.2013
comment
Я не хочу жестко кодировать функцию перенаправления. url_for должен позаботиться об этом. Теперь это работает. Спасибо. - person rajpy; 29.08.2013
comment
На самом деле я не ожидал, что буду писать «хост» во всем маршруте. Я создаю приложение с несколькими арендаторами, я хочу перенаправить пользователя на «register.domain.com» для регистрации, когда они посещают любой незарегистрированный домен, например: «test.domain.com», «py.domain.com». Если у вас есть какие-либо идеи, пожалуйста, дайте мне знать. Цените любую помощь. - person rajpy; 29.08.2013
comment
Flask не предназначен для этого. Вам нужно будет использовать Nginx/Apache, чтобы обеспечить переадресацию на ваше регистрационное приложение. - person aychedee; 29.08.2013
comment
Это похоже именно на то, что мне нужно; но я не могу заставить его работать. Что мне не хватает? - person orome; 16.02.2015