使用 FileField 和 HTML5 视频标签在 Django 上播放视频文件时出现 ConnectionResetError

ConnectionResetError while playing a video file over Django, with FileField and HTML5 video tag

我有一个 Django 项目,其中应用了一个 FileField 来存储视频文件 (mp4)。
视频文件实际上存储在 AmazonS3 上。

然后视频文件显示在相应的 HTML 上,通过 Django DetailView,带有 HTML5 视频标签。

<video width='50%' controls>
<source src="{{ object.video_sample.url }}" type="video/mp4">
    Your browser does not support the video tag.
</video>

该视频在本地(本地 ip)和部署的服务器上都播放良好。
但是,我一直在 terminal/logs 上收到这条恼人的错误消息:

Exception happened during processing of request from (...)
Traceback (most recent call last):
File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socketserver.py", line 650, in process_request_thread self.finish_request(request, client_address)
File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socketserver.py", line 360, in finish_request self.RequestHandlerClass(request, client_address, self)
File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socketserver.py", line 720, in init self.handle()
File ".../env/lib/python3.7/site-packages/django/core/servers/basehttp.py", line 171, in handle self.handle_one_request()
File ".../env/lib/python3.7/site-packages/django/core/servers/basehttp.py", line 179, in handle_one_request self.raw_requestline = self.rfile.readline(65537)
File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py", line 589, in readinto return self._sock.recv_into(b)
ConnectionResetError: [Errno 54] Connection reset by peer*

我认为这与用户在视频仍然打开时离开 HTML 页面有关。

你知道怎么解决吗?

BR,
沙哈尔

您看到的是本地 Django "runserver" 在处理大文件时中断的错误。 Django 并不是真正为提供静态文件而设计的,所以当您导航到另一个页面并且您的浏览器中断了视频流时,您确实会收到此错误。

这在制作中不应该是什么值得担心的事情:您的视频将由 S3 提供,或者最好是您添加到组合中的 CDN。当流中断时那些不会有问题(或者至少你不必担心它并且不会在你的日志中看到它)。在这种情况下 Django 根本不参与。

如果这阻碍了您的开发流程,您可能希望通过 adding a filter 将这些错误从您的开发日志中抑制到您的日志(仅在开发中)。