单个 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 实例上的多个域和子域的主要内容,如果未能解决你的问题,请参考以下文章

单个服务器上的多个子域。码头工人 + NGINX @ EC2

具有多个域和子域的 PHP 身份验证

想要在没有子域的单个域上运行两个单独的反应应用程序

搜索域和子域的所有 DNS TXT 记录

如何使用python在每个域和子域中查找站点地图

nginx server_name 通配符或包罗万象