Python 单个棱锥体实例上的多个域和子域

Python 单个棱锥体实例上的多个域和子域,python,sqlalchemy,pyramid,Python,Sqlalchemy,Pyramid,我希望在一个金字塔实例上有多个域和子域。然而,我似乎找不到关于它的任何文档。最后一个例子提到的是一个信息很少、没有示例的词汇表。你们中有谁有任何例子,或者可以告诉我更好的文档吗?Pyramid只是一个WSGI应用程序。这意味着它依赖于HTTP_主机环境密钥(由主机头设置)来确定应用程序的主机。这都是相对的。重点是金字塔对它可以接受的内容没有任何限制,因此世界就是你的牡蛎,你可以设置它,将内容限制在你喜欢的不同领域。当然,这从配置Web服务器以提供给应用程序的主机开始 假设您使用的是URL分派,您

我希望在一个金字塔实例上有多个域和子域。然而,我似乎找不到关于它的任何文档。最后一个例子提到的是一个信息很少、没有示例的词汇表。你们中有谁有任何例子,或者可以告诉我更好的文档吗?

Pyramid只是一个WSGI应用程序。这意味着它依赖于HTTP_主机环境密钥(由主机头设置)来确定应用程序的主机。这都是相对的。重点是金字塔对它可以接受的内容没有任何限制,因此世界就是你的牡蛎,你可以设置它,将内容限制在你喜欢的不同领域。当然,这从配置Web服务器以提供给应用程序的主机开始

假设您使用的是URL分派,您可能希望设计一些自定义路由谓词来检查
request.host
值,以获取所需的内容。从该谓词返回
False
,将阻止该路由匹配到该主机的请求

这是一个很大的主题,如果你能提供更多的细节,可能会有所帮助。例如,由于金字塔是相对的,所以您可能希望从“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'))

如果您可以控制您的托管环境,我强烈建议您不要使用金字塔结构中的域内容,并使用代理服务器(如ApacheModProxy)处理它,将其路由到金字塔结构中的子域。然后,您可以轻松地切换任何域名以查看路由,而不会在您的金字塔代码中包含任何脆弱的内容(如域名)。通过这种方式,你的应用程序代码将更加干净,并且以后更容易更改

这里有一个Apache示例,其中两个域连接到一个pyramid应用程序,假设我们以某种方式在端口5001(gunicorn或任何您想要的)上为pyramid应用程序提供服务


ServerName domain_2.com
代理主机
#将所有请求发送到我们位于/app1的应用程序/*
ProxyPass/http://127.0.0.1:5001/app_1/
ProxyPassReverse/http://127.0.0.1:5001/app_1/
ServerName domain_2.com
代理主机
#将所有请求发送到我们位于/app2的应用程序/*
ProxyPass/http://127.0.0.1:5001/app_2/
ProxyPassReverse/http://127.0.0.1:5001/app_2/
下面是一个域到多个金字塔实例的示例:

<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>

ServerName mydomain.com
代理主机
#管理员转到5001上的管理器应用程序
代理通行证/媒体/经理/http://127.0.0.1:5001/ 重试=5
ProxyPassReverse/media/manager/http://127.0.0.1:5001/
#从5002上的服务器应用程序下载
代理传递/媒体/服务器/http://127.0.0.1:5002/ 重试=5
ProxyPassReverse/媒体/服务器/http://127.0.0.1:5002/

学习这一方法的最大障碍是找不到类似的例子。你知道我在哪里可以找到更多的例子吗?非常感谢。对于这个特殊的设置,我不知道有太多的例子。通常,不同的子域代表不同的WSGI应用程序,它们都有自己的设置,可能还有一些共享的设置。有金字塔烹饪书中的各种例子,但我不知道有任何关于这一点的。这是一个相当古老的问题,但我已经使用Paste#urlmap来处理金字塔:
<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>