flacon make_response avec de gros fichiers
Donc, je suis vraiment "vert" avec des e/S de fichier et les limites de la mémoire et le tel, et je vais avoir un moment difficile l'obtention de mon application web pour réussir à servir de grandes téléchargements de fichiers à un navigateur web avec flacon de make_response
. Le code suivant fonctionne sur les petits fichiers (<~1 GO), mais donne-moi un MemoryError
Exception quand je suis dans les gros fichiers:
raw_bytes = ""
with open(file_path, 'rb') as r:
for line in r:
raw_bytes = raw_bytes + line
response = make_response(raw_bytes)
response.headers['Content-Type'] = "application/octet-stream"
response.headers['Content-Disposition'] = "inline; filename=" + file_name
return response
Je suis en supposant que le fait de tenir plus de 2 GO de données binaires dans une chaîne de caractères est probablement un gros no-no, mais je ne sais pas une alternative à la réalisation de ces fichier télécharger black magicks. Si quelqu'un pourrait me mettre sur la bonne voie avec une chunky[?] ou avec tampon approche pour les téléchargements de fichiers, ou tout simplement me diriger vers un niveau intermédiaire, les ressources afin de faciliter une compréhension plus profonde de ce genre de choses, je vous en serais très reconnaissante. Merci!
send_file()
fonction pour Flacon de servir le fichier pour vous.Parce que j'étais pas au courant de l'existence d'une telle fonction 😀 j'ai juste retravaillé la mise en œuvre de l'utiliser et maintenant j'ai une autre question; il semble se souvenir du premier fichier d'un type donné qui est ouvert et en utilisant que pour tous les fichiers de ce type. c'est à dire, si j'ai un tas de fichiers png, un fichier pdf et un fichier txt, la demande de téléchargement du premier corriger png, puis servir la même image pour toutes les autres, distinct fichier png. Sur le côté serveur, j'ai vérifié que le send_file fonction obtient le chemin d'accès correct pour le png, mais encore, elle se comporte mal.
Puis quelque chose d'autre est toujours mal; ce n'est pas le comportement que
send_file()
sur son propre peut produire.OriginalL'auteur SheffDoinWork | 2014-06-20
Vous devez vous connecter pour publier un commentaire.
Voir les docs sur La Diffusion De Contenu. Essentiellement, vous devez écrire une fonction qui donne des blocs de données, et de générateur pour la réponse, plutôt que toute chose à la fois. Flacon et votre serveur web faire le reste.
Si le fichier est statique, vous pouvez au lieu de prendre avantage de
send_from_directory()
. Les docs vous conseillons d'utiliser nginx ou un autre serveur qui prend en charge la X-SendFile, afin que la lecture et l'envoi des données est efficace.OriginalL'auteur davidism
Le problème dans votre tentative est, que vous êtes en première lecture complète du contenu dans "raw_bytes", donc avec des fichiers volumineux vous est facile d'en épuiser toute la mémoire que vous avez.
Il existe plusieurs options pour résoudre:
Streaming le contenu
Comme l'a expliqué davidism réponse, vous pouvez utiliser un générateur passé int Réponse. Cela sert d'un fichier volumineux pièce par pièce et ne nécessite pas autant de mémoire.
La diffusion en continu peut aller non seulement à partir d'un générateur, mais aussi à partir d'un fichier, comme indiqué dans cette réponse
De servir les fichiers statiques sur flacon
Dans le cas où votre fichier est statique, recherche pour comment configurer Flacon de servir les fichiers statiques. Ceux-ci doivent être automatiquement servi en streaming.
De servir les fichiers statiques sur
apache
ounginx
(ou un autre serveur web)En supposant que le fichier est statique, vous dans la production de servir en reverse proxy en face de votre ballon d'application. Ce n'est pas seulement transfère la charge de votre application, mais aussi des œuvres beaucoup plus rapide.
OriginalL'auteur Jan Vlcinsky