单个 Pyramid 实例上的多个域和子域
Posted
技术标签:
【中文标题】单个 Pyramid 实例上的多个域和子域【英文标题】:Multiple domains and subdomains on a single Pyramid instance 【发布时间】:2011-11-28 07:10:24 【问题描述】:我希望在单个 Pyramid 实例上拥有多个域和子域。但是,我似乎找不到任何关于它的文档。最后一个question 提到了一个词汇表,信息很少,也没有例子。你们有没有任何例子或者可以指导我更好的文档?
【问题讨论】:
这是一个相当古老的问题,但我使用 Paste#urlmap 来处理 Pyramid:pythonpaste.org/modules/urlmap.html 【参考方案1】:Pyramid 只是一个 WSGI 应用程序。这意味着它依赖于 HTTP_HOST 环境键(由 Host 标头设置)来确定应用程序的主机。这都是相对的。要点是 Pyramid 对它可以接受的内容没有限制,因此世界就是你的牡蛎,你可以将其设置为将内容限制在不同的域中,但你愿意。这当然从您的网络服务器配置为向您的应用程序提供哪些主机开始。
假设您正在使用 URL 调度,您可能想要设计一些自定义路由谓词来检查 request.host
值是否符合您的需要。从该谓词返回 False
将阻止该路由匹配到该主机的请求。
这是一个很大的话题,因此如果您提供更多细节可能会有所帮助。例如,由于 Pyramid 是相对的,因此您可能希望从“example.com”生成任何将某人重定向到“sub.example.com”的 URL 都需要通过预生成器完成。
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'))
【讨论】:
我在学习它是如何工作的最大障碍是我找不到任何这样的例子。你知道我在哪里可以找到更多的例子吗?谢谢! 对于这个特定的设置,我不知道太多的例子。通常,不同的子域代表不同的 WSGI 应用程序,它们每个都有自己的设置,可能有一些共享。有各种示例的 Pyramid Cookbook,但我对此一无所知。【参考方案2】:如果您可以控制您的托管环境,我会强烈建议将域内容保留在金字塔之外,并使用代理服务器(例如 apache mod 代理)处理它,路由到金字塔中的子域。然后,您可以轻松切换任何域名以查看路由,而不会在您的金字塔代码中包含任何脆弱的内容(如域名)。这样一来,您的应用代码会更加简洁,并且以后更容易更改。
这是一个 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>
【讨论】:
以上是关于单个 Pyramid 实例上的多个域和子域的主要内容,如果未能解决你的问题,请参考以下文章