【问题标题】:SimpleHTTPServer - Serving Big FilesSimpleHTTPServer - 服务大文件
【发布时间】:2012-09-15 06:18:35
【问题描述】:

我将python -m SimpleHTTPServer 用于一个小项目。文件 index.html 引用了一些视频。 <video><source src="big_buck_bunny_480p_stereo.ogg"></video> 该文件的大小为 159 MB。当我尝试下载它时,SimpleHTTPServer 会抛出一些错误消息而不是我的视频。

Marc-Laptop - - [23/Sep/2012 18:18:29] "GET /big_buck_bunny_480p_stereo.ogg HTTP
/1.1" 200 -
----------------------------------------
Exception happened during processing of request from ('192.168.4.38', 51152)
Traceback (most recent call last):
  File "C:Program Files (x86)PythonlibSocketServer.py", line 284, in _handle
_request_noblock
    self.process_request(request, client_address)
  File "C:Program Files (x86)PythonlibSocketServer.py", line 310, in process
_request
    self.finish_request(request, client_address)
  File "C:Program Files (x86)PythonlibSocketServer.py", line 323, in finish_
request
    self.RequestHandlerClass(request, client_address, self)
  File "C:Program Files (x86)PythonlibSocketServer.py", line 640, in __init_
_
    self.finish()
  File "C:Program Files (x86)PythonlibSocketServer.py", line 693, in finish
    self.wfile.flush()
  File "C:Program Files (x86)Pythonlibsocket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen

----------------------------------------

【问题讨论】:

  • 尝试在英文语言环境中运行服务器——英文错误消息通常更容易在搜索引擎上找到。
  • 那么,为什么要通过 Python 流式传输静态内容?首先,我建议您使用像 NGINX 或 Apache 这样的 HTTP 服务器来完成该任务。其次,我认为可能发生的情况是您尝试将整个文件加载到内存中,然后将其流式传输,但失败了 - 而是查看您是否可以先发送标头以了解其大小,然后逐块输出,以便根本没有加载到内存中。
  • @Veseliq 为什么将 Python 用于静态内容?网络服务器是网络服务器。 (我不怀疑整个文件被 slurped 的想法,但这与 Python 或其他一些服务器是正交的。)
  • 如您所见,我没有编写一行代码。只是使用,python给出的东西。在 http-connection 中,客户端只能请求文件的一部分(范围)。我想,SimpleHTTPServer 将能够处理这个问题。事实上,我只需要一个最小的 http-server,它将一些(可能很大的)文件传送到客户端(LAN)。也许有人知道 python 中的替代(且易于使用)解决方案。
  • pst,我同意,我的意思是,例如 Apache 和 NGINX 都针对服务器静态内容进行了高度优化,因此通常(尤其是 NGINX)是该任务的首选方式。我没有使用 SimpleHTTPServer 的经验,它可能有用于处理文件下载的内置方法,但如果它缺乏这样的功能,我会使用第二台服务器来完成该任务,只用 python 处理其余的请求。如果不是 - 正如我所说,您应该能够首先将标头刷新到浏览器(长度、类型等),然后开始一次输出文件几个字节(例如 1024)。否则它就大材小用了。

标签: python http simplehttpserver


【解决方案1】:

simpleHTTPServer 正在尝试缓冲所有内容,并且确实会因内存不足而爆炸。最好异步执行,但 simpleHTTPServer 不知道如何执行此操作。检查thread。有人提出了simpleHTTPserver的修改版:SimpleAsyncHTTPServer.py

【讨论】:

猜你喜欢
  • 2015-01-31
  • 2015-09-23
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
相关资源
最近更新 更多