我不确定为什么下面显示的代码会导致发送两个响应而不是一个。
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”?