在子路径下托管 Pyramid webapps

Posted

技术标签:

【中文标题】在子路径下托管 Pyramid webapps【英文标题】:Hosting Pyramid webapps under subpaths 【发布时间】:2013-03-14 12:51:39 【问题描述】:

我们有一个托管设置,我们有一个***域,我们在子路径下托管 Web 应用程序。例如:

/projects -> 克隆 / 内部 -> 雄猫 等等

在这种情况下,我们需要一种方法来告诉后端的 Web 应用程序它的基本路径是什么,以便它可以正确地生成指向其视图和静态内容的链接。对于上面的示例,这很好。

我们刚刚开始使用由 Waitress 提供服务的 Pyramid,但到目前为止我们还没有弄清楚如何做到这一点。有没有一种干净的方法可以在 Waitress 中配置这个基本路径,或者有没有更灵活的应用服务器可以支持 Pyramid?

【问题讨论】:

我假设您使用的是不同的前端 Web 服务器来代理所有这些 path->appserver 请求?对其进行所需的路径修剪可能是最简单的。 【参考方案1】:

repoze.vhm 应该适合您的用例。

如果您想使用虚拟根功能,我认为它不会起作用。即您的代理网络应用程序的子路径(https://hidden.tld/root/ 应显示为 https://example.com/

为了在外部域的子路径中公开您的应用程序 repoze.vhm 工作得很好。 IMO 最好的一点是,您不需要将任何子路径配置或任何内容放入您的 Web 应用程序部署中。这允许您在代理上将 url 更改为您想要的任何内容,甚至可以在多个域名和/或子路径上公开相同的应用程序实例。

【讨论】:

【参考方案2】:

在我的金字塔应用程序中,在 .ini 配置文件(生产和开发)中,我正在做这样的事情:

filter-with = urlprefix

[filter:urlprefix]
use = egg:PasteDeploy#prefix
prefix = /mysubfolder

我认为它可能与上面迈克尔的回答相同;我对 Pyramid 也还是比较陌生,我会像你一样放弃食谱。但最终结果是它从我的根目录创建了 /mysubfolder 的基本 URL,而应用程序的其余部分与此相关。这是在本地 pserve 下运行的,我认为 nginix 在我的网络主机上。

【讨论】:

【参考方案3】:

WSGI 中的所有内容都与当前请求相关。您只需要正确设置您的environ(通常由您的 WSGI 服务器)。

例如,如果 request.environ['SCRIPT_NAME'] == '/projects',您的 Web 应用程序将知道它安装在子路径 /projects。如果您希望您的应用程序对其挂载点不可知,您可以简单地对其进行编码,就好像它在/foo/bar 提供视图一样。然后你通过一些中间件将你的应用程序安装在/projects 上,这些中间件可以正确地改变environ(mod_wsgi 和其他一些服务器应该能够自动为你做这件事)。现在当传入的 URL 是 /projects/foo/bar environ['SCRIPT_NAME'] == '/projects'environ['PATH_INFO'] == '/foo/bar' 时,您的应用可以专注于相对路径。

在 Pyramid 中,这可以归结为 ini 中的一个额外步骤,您可以在其中将前缀中间件添加到 WSGI 堆栈中。中间件会为您处理更改 environ 中的 PATH_INFOSCRIPT_NAME 键。

[app:myapp]
use = egg:myapp

# ...

[filter:proxy-prefix]
use = egg:PasteDeploy#prefix
prefix = /projects

[pipeline:main]
pipeline =
    proxy-prefix
    myapp

【讨论】:

谢谢你,很明显我需要更多地了解 WSGI 并且不仅仅是遵循食谱。我还建议我可以(或者)在管道中使用 egg:repoze.vhm#vhm_path。 VHM 仅适用于遍历,并有一些注意事项,例如主要用于生成 url。但可以肯定的是,这可能是您的另一种选择。

以上是关于在子路径下托管 Pyramid webapps的主要内容,如果未能解决你的问题,请参考以下文章

无法在子路径上托管 Storybook

pyramid基本用法

Pyramid Traversal __name__ 匹配视图名称

Agisoft Photoscan 正射校正提示“Can‘t write pyramid data”

Pyramid 中的强制性身份验证

请求浏览器在子路径上以不同方式自动填充