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

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


person Jonathan Ong    schedule 30.09.2011    source источник
comment
Это довольно старый вопрос, но я использовал Paste#urlmap, чтобы сделать это с помощью Pyramid: pythonpaste.org /modules/urlmap.html   -  person Chip Kellam    schedule 13.12.2013


Ответы (2)


Пирамида — это просто приложение WSGI. Это означает, что он зависит от ключа среды HTTP_HOST (установленного заголовком 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'))
person Michael Merickel    schedule 30.09.2011
comment
Мое самое большое препятствие в изучении того, как это работает, заключается в том, что я не могу найти подобных примеров. Вы знаете, где я могу найти больше примеров? Благодарю вас! - person Jonathan Ong; 01.10.2011
comment
Для этой конкретной установки я не знаю слишком много примеров. Обычно разные поддомены представляют разные приложения WSGI, и у каждого из них есть свои собственные настройки, возможно, с некоторыми общими. Есть Поваренная книга пирамиды различных примеров, но я ничего не знаю об этом. - person Michael Merickel; 03.10.2011

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

Вот пример Apache, где два домена идут к одному приложению-пирамиде, предполагая, что мы так или иначе обслуживаем приложение-пирамиду через порт 5001 (пушка или что угодно).

<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>
person Iain Duncan    schedule 13.12.2015