3

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

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

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

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

4

3 回答 3

6

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

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

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

[app:myapp]
use = egg:myapp

# ...

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

[pipeline:main]
pipeline =
    proxy-prefix
    myapp
于 2013-03-25T06:53:02.870 回答
0

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

filter-with = urlprefix

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

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

于 2013-03-27T00:23:22.450 回答
0

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

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

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

于 2017-04-06T05:05:07.547 回答