Несколько доменов и поддоменов в одном экземпляре Pyramid - PullRequest
14 голосов
/ 30 сентября 2011

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

Ответы [ 2 ]

24 голосов
/ 30 сентября 2011

Pyramid - это приложение 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'))
0 голосов
/ 13 декабря 2015

Если у вас есть контроль над вашей хостинговой средой, я бы настоятельно предложил бы не использовать доменное содержимое вне пирамиды и обрабатывать его с помощью прокси-сервера, такого как прокси-сервер мод 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...