在子路径下托管Pyramid web应用

3 投票
3 回答
897 浏览
提问于 2025-04-17 20:11

我们有一个网站托管的设置,顶级域名下有一些子路径来托管网络应用。例如:

  /projects -> Plone
  /interal -> Tomcat
  etc

在这种情况下,我们需要一种方法来告诉后端的网络应用它的基本路径是什么,这样它才能正确生成指向其视图和静态内容的链接。对于上面的例子,这样做是没问题的。

我们刚开始使用Pyramid框架,并通过Waitress来提供服务,但到目前为止我们还没找到怎么做。有没有简单的方法可以在Waitress中配置这个基本路径,或者有没有更灵活的应用服务器可以支持Pyramid?

3 个回答

0

repoze.vhm 对你的需求来说应该是个不错的选择。

不过,如果你想使用虚拟根目录的功能,它可能就不太适用了。也就是说,如果你的代理网站应用的某个子路径(比如 https://hidden.tld/root/)想要显示成 https://example.com/,那就可能不行。

但如果你想在外部域名的子路径下展示你的应用,repoze.vhm 还是可以很好地工作的。在我看来,它最棒的地方在于,你不需要在你的网页应用部署中添加任何子路径的配置。这让你可以在代理上随意更改网址,甚至可以在多个域名和/或子路径上展示同一个应用实例。

0

在我的Pyramid应用程序中,在.ini配置文件(生产和开发环境)里,我做了类似这样的设置:

filter-with = urlprefix

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

我觉得这可能和上面Michael的回答效果差不多;我对Pyramid也还比较陌生,和你一样在参考一些示例。不过最终的结果是,它从我的根目录创建了一个基础网址/mysubfolder,应用的其他部分都是相对于这个网址的。这是在本地使用pserve运行的,我想在我的网络主机上是用nginx。

6

在WSGI中,一切都是相对于当前的请求来说的。你只需要确保你的environ设置正确(通常是由你的WSGI服务器来完成的)。

举个例子,如果你的网页应用知道它被挂载在子路径/projects上,那么request.environ['SCRIPT_NAME'] == '/projects'。如果你希望你的应用不关心它被挂载的位置,你可以简单地把它写成好像它在/foo/bar提供服务。然后通过一些中间件把你的应用挂载到/projects上,这些中间件可以正确地修改environ(mod_wsgi和其他一些服务器应该能自动为你做到这一点)。这样,当传入的URL是/projects/foo/bar时,environ['SCRIPT_NAME'] == '/projects',而environ['PATH_INFO'] == '/foo/bar',你的应用就可以专注于相对路径了。

在Pyramid框架中,这就意味着你需要在你的ini文件中多加一步,把前缀中间件添加到你的WSGI堆栈中。这个中间件会帮你处理PATH_INFOSCRIPT_NAMEenviron中的修改。

[app:myapp]
use = egg:myapp

# ...

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

[pipeline:main]
pipeline =
    proxy-prefix
    myapp

撰写回答