单个Pyramid实例上的多个域和子域

时间:2011-09-30 08:27:39

标签: python sqlalchemy pyramid

我希望在单个Pyramid实例上拥有多个域和子域。但是,我似乎无法找到任何文件。最后question提到的词汇表信息很少而且没有例子。你们有没有任何例子或者可以指导我更好的文档?

2 个答案:

答案 0 :(得分:24)

Pyramid只是一个WSGI应用程序。这意味着它依赖于HTTP_HOST环境密钥(由Host头设置)来确定应用程序的主机。这都是相对的。金字塔对其所能接受的内容没有任何限制,因此世界就是你的牡蛎,你可以将它设置为限制你想要的各个领域的内容。当然,这可以从您的网络服务器配置为提供给您的应用程序的主机开始。

假设您正在使用URL分派,您可能需要设计一些自定义路由谓词,以检查request.host值是否符合您的要求。从该谓词返回False将阻止该路由将请求与该主机匹配。

这是一个很大的主题,所以如果你提供一些更具体的内容可能会有所帮助。例如,由于Pyramid是相对的,因此您可能希望从“example.com”生成的任何URL以将某人重定向到“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'))

答案 1 :(得分:0)

如果您可以控制您的托管环境,我会强烈建议将域名保留在金字塔之外,并使用代理服务器(如apache mod proxy)处理它,路由到金字塔中的子域。然后,您可以轻松切换任何域名以查看路由,而不会在金字塔代码中出现任何脆弱的内容(如域名)。您的应用代码将以这种方式更加清晰,以后更容易更改。

这是一个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>