Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将HTTP/1.1与SimpleHTTPRequestHandler一起使用_Python_Http_Http 1.1 - Fatal编程技术网

Python 将HTTP/1.1与SimpleHTTPRequestHandler一起使用

Python 将HTTP/1.1与SimpleHTTPRequestHandler一起使用,python,http,http-1.1,Python,Http,Http 1.1,当我将HTTP/1.1与SimpleHTTPRequestHandler一起使用时,加载一个拉入其他资源的页面将挂起在第二个资源之后 这是一台小型复制机: from SimpleHTTPServer import SimpleHTTPRequestHandler from BaseHTTPServer import HTTPServer class MyRequestHandler(SimpleHTTPRequestHandler): #protocol_version = "HTTP

当我将HTTP/1.1与SimpleHTTPRequestHandler一起使用时,加载一个拉入其他资源的页面将挂起在第二个资源之后

这是一台小型复制机:

from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import HTTPServer

class MyRequestHandler(SimpleHTTPRequestHandler):
    #protocol_version = "HTTP/1.0"   # works
    protocol_version = "HTTP/1.1"   # hangs

server = HTTPServer(("localhost", 7080), MyRequestHandler)
server.serve_forever()
使用上述服务器,当浏览器尝试加载
b.png
时,以下HTML将挂起:

<html>
    <body>
        <img src="a.png">
        <img src="b.png">
    </body>
</html>


HTTP/1.1可以与SimpleHTTPServer模块一起使用吗?如果可以,如何使用?请注意,将ForkingMixIn或ThreadingMixIn添加到服务器将允许事情继续进行,但是,似乎没有这两个Mixin中的任何一个都是可能的。

您看到的行为是由于三个原因:

  • BaseHTTPServer。默认情况下,HTTPServer一次只能处理一个请求
  • 大多数用户代理(浏览器)一次打开多个到任何给定主机的连接
  • 大多数用户代理使用HTTP 1.1的
    保持活动状态
    功能,并且在收到请求的实体后不会立即关闭连接
您看到的是,浏览器能够使用它打开到服务器的第一个连接获取所有请求。这是页面本身,可能还有它的一些资源。同时,浏览器打开其他连接以获取其余资源,但这些连接无法继续,因为服务器与第一个连接绑定。服务器与第一个服务器绑定的原因是,尽管浏览器已经接收到使用此连接请求的实体,但它不会立即关闭它,以防在不久的将来重用它以获得更多实体(服务器也不会关闭其一侧的连接,因为浏览器指定了HTTP的1.1版并发送了
连接:保持活动
标头)。只有在第一个连接超时后,服务器才会开始处理下一个等待的连接,以便下载其他资源(所有这些都是使用此特定连接请求的)。如果您等待足够长的时间,浏览器将设法获取所有资源。您可以在将
网络.http.max persistent connections per server
首选项设置为1(而不是默认的6)时观察到差异在Firefox或类似的浏览器中。然后,由于所有资源都是使用相同的连接请求的,所以每次检索前一个资源时都会立即开始,不会有任何延迟


我要感谢freenode.net上的#python IRC频道的marienz对这个问题的帮助。

你在这里写的是一个小的复制程序,但是这里没有页面可以吸引其他资源,所以我猜它不可能是一个复制程序。请描述一下如何复制这个问题。@Piotrdorgost它太小了,我没有发布它(任何包含多个资源的页面都会触发它),但我发布了显示问题的示例HTML(您需要为a.png和b.png提供png)。Python的版本和操作系统是什么?@piotrdorogost Python的版本并不重要。问题在于修改SimpleHTTPRequestHandler的行为。同样的行为在python2.4、python2.7和python3.2中也会发生(你只需使用python3稍微更改导入)。这在Linux上(Ubuntu和Linux Mint的多个版本)。我没有使用线程或分叉混合,所以我怀疑Windows中也会发生同样的行为。感谢您的解释!我已经在这方面停留了好几天。我添加了一个线程混合,这似乎解决了问题,但直到找到这篇文章,我才明白问题出在哪里。