使用Twisted Web服务器将子路径添加到资源根目录的正确步骤是什么?

时间:2018-09-20 22:37:59

标签: python-2.7 http server twisted

我不确定为什么下面显示的代码会导致发送两个响应而不是一个。

from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor
from optparse import OptionParser

class FormPage(Resource):
    isLeaf = True 

def render_GET(self, request):
   return "<html><HEAD></HEAD><body>OK</body></html>"

def render_POST(self, request):
    return "<html><HEAD></HEAD><body>OK</body></html>"

parser = OptionParser()

parser.add_option("-p", dest="port",type="int",default=80,
                    help="Local Port to listen ON")

parser.add_option("-u", dest="form1",default="api",
                    help="URL form page")

parser.add_option("-w", dest="form2", default="name",
                    help="URL form page")

(options, args) = parser.parse_args()


print 'Messaging App Server will receive messages posted to  "0.0.0.0:%d/%s/%s"' % (options.port, options.form1, options.form2)


root = FormPage() 
root.putChild("%s" % options.form1, FormPage())
root.putChild("%s" % options.form2, FormPage())


print("\nroot = %s\n" % root)


factory = Site(root) 
reactor.listenTCP(options.port, factory) 
reactor.run() 

我在服务器上运行上述代码,如下所示:

python filename.py 

然后我打开浏览器并按如下所示输入URL:

192.168.x.y/api/name

正如预期的那样,我得到以下响应:

ok

但是,当我同时运行一个tcpdump时,我看到render_GET被调用了两次,而不是一次,但是我不明白为什么?

有人可以提供解决方案/建议吗?

我的直觉是我不正确理解putChild()函数。我的目标是向IP地址添加路径。我的理解是,这段代码创建了一个资源,该资源将对应于URL层次结构的根

root = FormPage()

因此,在建立了根之后,再添加子代:

root.putChild("%s" % options.form1, FormPage())
root.putChild("%s" % options.form2, FormPage())

据我所知,这将导致检索根,然后是“ api”,然后是“ name”。

是不是我收到了对“ api”的调用返回的“ ok”,然后过了一会儿才对“ name”进行了调用?

如果我的假设是正确的,那么我应该如何添加api / name路径,以免出现两个调用,即只有一个“ ok”?

0 个答案:

没有答案