from uploads.models import Wanted
from django.http import FileResponse, Http404
def download(request, pk):
"""Download A File""
# Retrieve the file
wanted = Wanted.objects.filter(pk=pk)
wanted = wanted.first()
# confirm that user has authority to download file
if wanted.ocassionfk.owner == request.user:
file_name = str(wanted.archive)
file_path = settings.MEDIA_ROOT + "/" + file_name
response = FileResponse(open(file_path, "rb"), as_attachment=True)
The above view is offering me 3hrs to download a file of 250MB. Something is wrong. Why is django serving 250Mb file using 2-3hrs?
In addition to the above phenomenon, I am unable to resume downloads when they fail midway. This is frustrating. While I am suspecting the webserver too, I wonder if there is something I should do on the Django end to guarantee the resumption of downloads at least
The slowness might be the server. It might also be the ISP. You haven’t provided any information about your deployment environment so we can’t tell what the source of the delays may be.
I don’t know how browsers handle requests to resume a download, I’d guess they would issue a byte-range request. (I’ve never bothered to look.) If that’s the case, then you would need to handle the range header to determine where to resume the transfer.
However, this is one of those cases where I think you’d really be better off if you didn’t handle it within Django. If I had to approach something like this, I’d return a url that referenced the file and allow the file server to handle it like any other static or media file. We don’t use Django for file transfers - nginx is far superior for those functions (including knowing how to handle the range headers).
Added the following to nginx location context:
and added the following to the above
response['Accept-Ranges'] = 'bytes'
Download now resumes. Speeds are still ridiculous sometimes … investigating
I have come to the conclusion that the slowness is from my ISP. Sometimes it si fast, sometimes not.