Pour obtenir le "meilleur des deux mondes", vous pourriez combiner la solution de S.Lott avec la solution Module xsendfile mod_xsendfile : django génère le chemin d'accès au fichier (ou le fichier lui-même), mais le service réel du fichier est géré par Apache/Lighttpd. Une fois que vous avez configuré mod_xsendfile, l'intégration à votre vue ne prend que quelques lignes de code :
from django.utils.encoding import smart_str
response = HttpResponse(mimetype='application/force-download') # mimetype is replaced by content_type for django 1.7
response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name)
response['X-Sendfile'] = smart_str(path_to_file)
# It's usually a good idea to set the 'Content-Length' header too.
# You can also set any other required headers: Cache-Control, etc.
return response
Bien sûr, cela ne fonctionnera que si vous avez le contrôle de votre serveur, ou si votre hébergeur a déjà configuré mod_xsendfile.
EDITAR:
mimetype est remplacé par content_type pour django 1.7
response = HttpResponse(content_type='application/force-download')
EDITAR: Pour nginx
vérifier este il utilise X-Accel-Redirect
au lieu de apache
En-tête X-Sendfile.
2 votes
Pourquoi n'utilisez-vous pas simplement Apache pour faire cela ? Apache sert le contenu statique plus rapidement et plus simplement que Django ne pourra jamais le faire.
27 votes
Je n'utilise pas Apache car je ne veux pas que les fichiers soient accessibles sans les permissions qui sont basées dans Django.
3 votes
Si vous voulez prendre en compte les permissions des utilisateurs, vous devez servir le fichier à travers la vue de Django.
138 votes
Exactement, c'est pourquoi je pose cette question.