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