我正在维护一个名为NotreDAM的开源文档资产管理应用程序,该应用程序是在运行于 Apache 的TwistedWeb实例的Django中编写的。
每当任何用户下载文件时,应用程序都会在整个下载过程中为所有用户挂起。我已经在代码中跟踪了下载命令,但我不熟悉Python / Django,知道为什么会发生这种情况。
response = HttpResponse(open(fullpath, 'rb').read(), mimetype=mimetype)
response["Last-Modified"] = http_date(statobj.st_mtime)
response["Content-Length"] = statobj.st_size
if encoding:
response["Content-Encoding"] = encoding
return response
你知道如何在文件下载时修复应用程序吗?
答案 0 :(得分:0)
Web服务器读取内存中的整个文件而不是流式传输。它不是编写良好的代码,但本身并不是错误。
这会在整个文件读取期间阻止Apache客户端(预分叉)。如果IO很慢且文件很大,则可能需要一些时间。
通常,您有几个预分叉的Apache客户端配置为满足此类请求,但在配置错误的Web服务器上,您可能会遇到此类问题,这不是Django问题。您的Web服务器可能只运行一个预分叉进程,可能处于调试模式。
答案 1 :(得分:0)
notreDAM使用django.views.static.serve()命令提供资产文件,根据Django文档“使用此方法效率低且不安全。请勿在生产环境中使用此命令。仅用于开发“。我们去了。我必须使用另一个命令。