Cherrypy VirtualHost调度程序无法正常工作

时间:2013-10-31 03:20:53

标签: cherrypy

我在我的cherrypy配置中有以下内容,但/ foo没有处理我对http://foo.bar.com的请求...这个樱桃应用程序在nginx后面,它正在传递主机头 - 我正在输出主机头在/并返回'foo.bar.com'所以我希望/ foo能够处理这个请求。

[/]
request.dispatch = cherrypy.dispatch.VirtualHost(**{ 
    'foo.bar.com': '/foo',
})

Nginx正在使用:

执行proxy_pass到127.0.0.1
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

2 个答案:

答案 0 :(得分:0)

我不明白这个问题,但它似乎是一个应用程序vs全局配置问题。我在server.cfg中设置了VirtualHosts,它被加载到全局配置中,我在没有应用程序配置的情况下进行安装:

cherrypy.config.update("server.cfg")
cherrypy.tree.mount(root, "/")

设置应用程序配置修复了问题:

conf = {
  "/": {
    "request.dispatch": cherrypy.dispatch.VirtualHost(
      **{
        "foo.domain.com:8000": "/foo",
        "bar.domain.com:8000": "/bar"
      }
    )
  }
}
cherrypy.tree.mount(root, "/", conf)

如果有人想解释我会接受他们的回答。我现在想知道我在server.cfg(cherrypy.config)中的[/]下的任何设置是否可以正常工作,或者是否所有路径特定的配置都需要在应用程序配置中。

答案 1 :(得分:0)

您无法从全局配置中设置调度程序,我认为这不是显而易见的dispatcher itself is responsible of handling the merging of the configurations

混淆的另一个原因是因为如果使用cherryd命令,看起来似乎是正常的。

例如,您可以部署这样的应用程序:

cherryd -c server.cfg 

server.cfg为:

[global]
tree.app = myapp.root
[/]
request.dispatch = cherrypy.dispatch.MethodDispatcher()

myapp.py上执行以下实施:

import cherrypy

class Root(object):
    exposed = True

    def GET(self):
        return "Hi!"

root = cherrypy.Application(Root())

cherryd在他的支持下有一些技巧。

一个是添加的命名空间“树”,您在其上设置tree.NAME_OF_APP = INSTANCE_OF_CHERRYPY_APP,更重要的是在“全局”配置文件上设置调度程序,因为cherryd命令将配置文件合并到应用程序中树上只安装了一个应用程序。

类似的东西:

cherrypy.tree.apps.values()[0].merge(config)

有效地将“全局”配置设置为“每个应用程序本地”配置。