cherrypy和WSGI应用中的相对路径
在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 个回答
这个应该怎么处理呢
app = cherrypy.tree.mount(MyApp(), '', 'settings.config')
要怎么解决 http://localhost/apps/myapp 呢?你试过 http://localhost/ 或者 http://localhost/MyApp 吗?
你在Apache里定义WSGIScriptAlias的位置也很重要。是在虚拟主机(vhost)里,还是在某个位置(location)呢?
我正在这样做,不过这需要cherrypy知道相对路径:
class Dir: pass
root = Dir()
root.apps = Dir()
root.apps.myapp = MyApp()
cherrypy.tree.mount(root)
这样我就可以按照我需要的方式来组织应用程序。我使用的是nginx,而不是Apache,但我觉得这没什么区别。不过,如果你使用的路径很长,中间又没有太多其他内容,这样写会显得有点啰嗦。
cherrypy可以支持其他调度器,这些可能更适合你想要做的事情,或者你可能需要自己写一个自定义的调度器。