Question

I'm maintaining an open-source document asset management application called NotreDAM, which is written in Django running on Apache an instance of TwistedWeb.

Whenever any user downloads a file, the application hangs for all users for the entire duration of the download. I've tracked down the download command to this point in the code, but I'm not enough versed with Python/Django to know why this may be happening.

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

Do you know how I could fix the application hanging while a file downloads?

Was it helpful?

Solution

The web server reads the whole file in the memory instead of streaming it. It is not well written code, but not a bug per se.

This blocks the Apache client (pre-forked) for the duration of whole file read. If IO is slow and the file is large it may take some time.

Usually you have several pre-forked Apache clients configured to satisfy this kind of requests, but on a badly configured web server you may exhibit this kind of problems and this is not a Django issue. Your web server is probably running only one pre-forked process, potentially in a debug mode.

OTHER TIPS

notreDAM serves the asset files using the django.views.static.serve() command, which according to the Django docs "Using this method is inefficient and insecure. Do not use this in a production setting. Use this only for development." So there we go. I have to use another command.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top