Я хочу иметь несколько доменов и поддоменов в одном экземпляре Pyramid. Тем не менее, я не могу найти документацию по нему. Последний вопрос относится к глоссарию с очень небольшим количеством информации и без примеров. Есть ли у кого-нибудь из вас какие-либо примеры или вы можете направить меня к лучшей документации?
Несколько доменов и поддоменов на одном экземпляре Pyramid
Ответы (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'))
Если у вас есть контроль над средой хостинга, я бы настоятельно посоветовал держать доменные вещи подальше от пирамиды и обрабатывать их с помощью прокси-сервера, такого как прокси-сервер 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>