如何使我的简单扭曲代理工作?

时间:2010-02-15 22:28:01

标签: python proxy twisted

我正在尝试使用Twisted.Web框架。

注意三行注释(#line1,#line2,#line3)。我想创建一个代理(网关?),它将根据网址将请求转发给两个服务器之一。如果我取消注释注释1或2(并注释其余注释),请求将被代理到正确的服务器。但是,当然,它不会根据URL选择服务器。

from twisted.internet import reactor
from twisted.web import proxy, server
from twisted.web.resource import Resource

class Simple(Resource):
    isLeaf = True
    allowedMethods = ("GET","POST")

    def getChild(self, name, request):
        if name == "/" or name == "":
            return proxy.ReverseProxyResource('localhost', 8086, '')
        else:
            return proxy.ReverseProxyResource('localhost', 8085, '')

simple = Simple()
# site = server.Site(proxy.ReverseProxyResource('localhost', 8085, '')) #line1   
# site = server.Site(proxy.ReverseProxyResource('localhost', 8085, '')) #line2   
site = server.Site(simple)                                              #line3   
reactor.listenTCP(8080, site)
reactor.run()

正如上面的代码所示,当我运行此脚本并导航到服务器“localhost:8080 / ANYTHING_AT_ALL”时,我得到以下响应。

  

不允许的方法

     

您的浏览器使用方法“GET”接近我(在/ ANYTHING_AT_ALL)。一世   只允许方法GET,POST在这里。

我不知道我做错了什么?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

由于您的Simple类实现了getChild()方法,因此暗示这不是叶节点,但是,您通过设置isLeaf = True来声明它是叶节点。 (叶节点如何生成子节点?)。

尝试将isLeaf = True更改为isLeaf = False,您会发现它会像您期望的那样重定向到代理。

来自Resource.getChild docstring:

... This will not be called if the class-level variable 'isLeaf' is set in
    your subclass; instead, the 'postpath' attribute of the request will be
    left as a list of the remaining path elements....

答案 1 :(得分:2)

这是最终的工作解决方案。基本上两个资源请求转到GAE服务器,所有剩余的请求都转到GWT服务器。

除了实现mhawke的更改之外,只有一个其他更改,即将“”/“+ name”添加到代理服务器路径。我认为必须这样做,因为路径的一部分被消耗并放在'name'变量中。

from twisted.internet import reactor
from twisted.web import proxy, server
from twisted.web.resource import Resource

class Simple(Resource):
    isLeaf = False
    allowedMethods = ("GET","POST")
    def getChild(self, name, request):
        print "getChild called with name:'%s'" % name
        if name == "get.json" or name == "post.json":
            print "proxy on GAE"
            return proxy.ReverseProxyResource('localhost', 8085, "/"+name)
        else:
            print "proxy on GWT"
            return proxy.ReverseProxyResource('localhost', 8086, "/"+name)

simple = Simple()
site = server.Site(simple)
reactor.listenTCP(8080, site)
reactor.run()

谢谢。