【发布时间】: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