Несколько доменов и поддоменов в одном экземпляре Pyramid

Я ищу несколько доменов и поддоменов на одном экземпляре Pyramid. Однако я не могу найти документацию. Последний question ссылался на глоссарий с очень небольшой информацией и примерами. У кого-нибудь из вас есть какие-либо примеры или вы можете направить меня к лучшей документации?

Ответы

Ответ 1

Пирамида - это просто приложение WSGI. Это означает, что он зависит от ключа среды HTTP_HOST (установленного заголовком хоста), чтобы определить хост приложения. Все это относительное. Точка, что у Pyramid нет ограничений на то, что она может принять, таким образом, мир - ваш устрик, и вы можете настроить его, чтобы ограничить контент различными областями, как бы вы ни хотели. Это, конечно же, начинается с того, на каких серверах настроен ваш веб-сервер для подачи вашего приложения.

Предполагая, что вы используете отправку URL-адресов, вам может потребоваться разработать некоторые пользовательские предикаты маршрута, которые проверяют значение request.host для всего, что вам нужно. Возврат False из этого предиката будет препятствовать тому, чтобы этот маршрут не соответствовал запросу этому хосту.

Это большая тема, поэтому она может помочь, если вы дадите более подробную информацию. Например, поскольку Pyramid относительна, любой URL-адрес, который вы хотите создать с example.com для перенаправления кого-либо на "sub.example.com", должен выполняться с помощью прегенератора.

def pregen(request, elements, kw):
    kw['_app_url'] = 'http://sub.example.com'
    return elements, kw

def req_sub(info, request):
    return request.host.startswith('sub')

config.add_route('sub_only', '/',
                 custom_predicates=(req_sub,),
                 pregenerator=pregen)
config.add_route('foo', '/foo')
config.add_view(view, route_name-'foo')

def view(request):
    # redirect the user to "http://sub.example.com", regardless of whether
    # request.host is "example.com" or "sub.example.com"
    return HTTPFound(request.route_url('sub_only'))

Ответ 2

Если у вас есть контроль над вашей средой хостинга, я бы настоятельно рекомендовал сохранить материал домена из пирамиды и обработать его прокси-сервером, таким как прокси-сервер apache, маршрутизацию в поддомены в пирамиде. Затем вы можете легко переключить любое из доменных имен, чтобы просмотреть маршрутизацию, не имея в своем пирамидном коде каких-либо хрупких (например, имен доменов). Таким образом, ваш код приложения будет намного более чистым, и его гораздо легче изменить позже.

Здесь пример Apache двух доменов, идущих в одно приложение для пирамиды, предполагая, что мы как-то обслуживаем приложение пирамиды на порте 5001 (gunicorn или все, что вы хотите).

<VirtualHost *:80>
    ServerName domain_2.com

    ProxyPreserveHost On

    # send all request to our app at /app1/*
    ProxyPass / http://127.0.0.1:5001/app_1/
    ProxyPassReverse / http://127.0.0.1:5001/app_1/

</VirtualHost>

<VirtualHost *:80>
    ServerName domain_2.com

    ProxyPreserveHost On

    # send all request to our app at /app2/*
    ProxyPass / http://127.0.0.1:5001/app_2/
    ProxyPassReverse / http://127.0.0.1:5001/app_2/

</VirtualHost>

И вот пример одного домена, относящегося к нескольким экземплярам пирамиды:

<VirtualHost *:80>
    ServerName mydomain.com

    ProxyPreserveHost On

    # admin go to manager app on 5001
    ProxyPass /media/manager/ http://127.0.0.1:5001/ retry=5
    ProxyPassReverse /media/manager/ http://127.0.0.1:5001/

    # downloads from server app on 5002
    ProxyPass /media/server/ http://127.0.0.1:5002/ retry=5
    ProxyPassReverse /media/server/ http://127.0.0.1:5002/

</VirtualHost>