Как мне заставить работать мой простой витой прокси? - PullRequest
3 голосов
/ 16 февраля 2010

Я пытаюсь использовать Twisted.Web framework.

Обратите внимание на трехстрочные комментарии (# line1, # line2, # line3). Я хочу создать прокси (шлюз?), Который будет пересылать запрос на один из двух серверов в зависимости от URL. Если я раскомментирую комментарий 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", я получаю следующий ответ.

Метод не разрешен

Ваш браузер подошел ко мне (в / ANYTHING_AT_ALL) с методом "GET". я здесь разрешены только методы GET, POST.

Я не знаю, что я делаю не так? Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 16 февраля 2010

Поскольку ваш класс Simple реализует метод getChild(), подразумевается, что это не листовой узел, однако вы заявляете, что это листовой узел, установив isLeaf = True. (Как у листового узла может быть ребенок?).

Попробуйте изменить isLeaf = True на isLeaf = False, и вы обнаружите, что он перенаправляется на прокси-сервер, как и следовало ожидать.

Из строки документов Resource.getChild:

... 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....
2 голосов
/ 16 февраля 2010

Вот окончательное рабочее решение. В основном два запроса ресурсов направляются на сервер GAE, а все оставшиеся запросы - на сервер GWT.

Кроме реализации изменения mhawke, есть только одно другое изменение, добавляющее «/ / + имя» к пути прокси-серверов. Я предполагаю, что это нужно было сделать, потому что эта часть пути была использована и помещена в переменную 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()

Спасибо.

...