示例python twisted事件驱动web应用程序将请求计数增加2,为什么?

示例python twisted事件驱动web应用程序将请求计数增加2,为什么?,python,twisted,Python,Twisted,由给出的基本web服务器的示例代码似乎将每个请求的请求计数器增加2,而不是1 守则: from twisted.web import server, resource from twisted.internet import reactor class HelloResource(resource.Resource): isLeaf = True numberRequests = 0 def render_GET(self, request): sel

由给出的基本web服务器的示例代码似乎将每个请求的请求计数器增加2,而不是1

守则:

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

class HelloResource(resource.Resource):
    isLeaf = True
    numberRequests = 0

    def render_GET(self, request):
        self.numberRequests += 1
        request.setHeader("content-type", "text/plain")
        return "I am request #" + str(self.numberRequests) + "\n"

reactor.listenTCP(8080, server.Site(HelloResource()))
reactor.run()
查看代码,您应该能够连接到url并看到:

然后刷新页面并查看:

I am request #2
然而,我看到:

I am request #3
当我再次刷新时,我看到:

I am request #5
因此,从计数器判断,服务器似乎为每个请求调用函数“render_GET”两次。我使用Python2.7在Windows7上运行这个。你知道会发生什么,或者这是预期的行为吗


更新:代码工作得很好,是浏览器太狡猾了。每次页面刷新时,浏览器都会发送一个“/”和“/favicon.ico”的GET请求,这将导致增加2,因为每次页面刷新都会调用render_GET函数两次。

浏览器的行为可能会令人惊讶。如果您尝试打印完整请求,您可能会发现它正在请求“/”和“favicon.ico”,例如。

浏览器可能正在对
favicon.ico
发出第二个请求


您应该让服务器在收到请求时打印请求位置。这将告诉您这是否正确。

这当然解释了浏览器中每次“刷新”都有两个HTTP请求的事实,但这不会导致只打印奇数个请求号。@AndréCaron:为什么不?如果它总是在页面内容之后请求favicon,那么它会像(1)页面、(2)图标、(3)页面、(4)图标等,并且所有的页码都是奇数。AFAICT,
render\u GET
使用GET方法为所有HTTP请求调用,不管URL是
/
还是
/favicon.ico
。除非我遗漏了什么?@AndréCaron:没错,但你为什么认为答案没有解决奇数请求号码的原因?如果我正确理解代码,你会在浏览器中看到“请求3”消息。因此,只显示对“/”的请求。在返回之前添加一个print语句,您将在控制台中看到所有请求。这当然可以解释为什么浏览器中每次“刷新”都有两个HTTP请求,但这不应该导致只打印奇数请求号。这种行为是一致的,还是每次尝试都会更改请求号?尝试按住浏览器中的F5键以快速刷新,然后检查请求编号是否总是奇数,或者是否随机跳过编号。
I am request #5