cherrypy和WSGI应用中的相对路径

6 投票
2 回答
1354 浏览
提问于 2025-04-16 06:46

在Apache上用mod_wsgi运行cherrypy,同时还有一个PHP应用。这个cherrypy应用并不是挂在根目录下,而是通过Apache配置文件中的WSGIScriptAlias挂在类似'localhost/apps/myapp'的路径上。

在testapp.py文件中,我尝试了以下代码,当我在浏览器中访问localhost/apps/myapp时:

app = cherrypy.tree.mount(MyApp(), '', 'settings.config') #FAILS WITH 404

还有

app = cherrypy.tree.mount(MyApp(), '/apps/myapp', 'settings.config') # WORKS

第一个情况失败了,因为cherrypy期望自己在服务器的根目录下,而不是相对于它在Apache中通过WSGI挂载的位置。

有没有什么好的方法可以让cherrypy应用相对于它在Apache中通过WSGIScriptAlias挂载的路径正常工作呢?

基本上,我会在几个不同的路径下运行多个cherrypy应用,我希望Apache能处理请求的分发(也就是说,cherrypy只负责运行应用,而不需要担心相对路径)。这样的话,每次服务器上的相对路径发生变化时,我就不需要更新多个不同的Python文件或配置文件了。

有什么建议吗?

顺便提一下,当前cherrypy应用是这样传递给wsgi应用的:

app = cherrypy.tree.mount(HelloWorld(), '', 'settings.config')
return app(environ, start_response)

2 个回答

0

这个应该怎么处理呢

app = cherrypy.tree.mount(MyApp(), '', 'settings.config')

要怎么解决 http://localhost/apps/myapp 呢?你试过 http://localhost/ 或者 http://localhost/MyApp 吗?

你在Apache里定义WSGIScriptAlias的位置也很重要。是在虚拟主机(vhost)里,还是在某个位置(location)呢?

1

我正在这样做,不过这需要cherrypy知道相对路径:

class Dir: pass
root = Dir()
root.apps = Dir()
root.apps.myapp = MyApp()
cherrypy.tree.mount(root)

这样我就可以按照我需要的方式来组织应用程序。我使用的是nginx,而不是Apache,但我觉得这没什么区别。不过,如果你使用的路径很长,中间又没有太多其他内容,这样写会显得有点啰嗦。

cherrypy可以支持其他调度器,这些可能更适合你想要做的事情,或者你可能需要自己写一个自定义的调度器。

撰写回答