Sie möchten keinen Dateizeiger als festlegen. Dies führt dazu, dass der WSGI-Server Zeile für Zeile die Datei liest (wie for line in file
), was normalerweise nicht der effizienteste Weg ist, um einen Datei-Upload zu steuern (stellen Sie sich ein Zeichen pro Zeile vor). Pyramid unterstützt Dateien über die Datei pyramid.response.FileResponse
. Sie können eines davon erstellen, indem Sie ein Dateiobjekt übergeben.
response = FileResponse('/some/path/to/a/file.txt')
response.headers['Content-Disposition'] = ...
Eine andere Möglichkeit ist es, einen Dateizeiger auf app_iter
passieren, aber es in der pyramid.response.FileIter
Objekt wickeln, die eine vernünftige Blockgröße verwenden wird nur zu vermeiden, indem Sie die Datei Zeile für Zeile lesbar.
Die WSGI-Spezifikation hat strenge Anforderungen, dass Antwort-Iteratoren, die eine close
Methode enthalten, am Ende der Antwort aufgerufen werden. Die Einstellung response.app_iter = open(...)
sollte daher keine Speicherlecks verursachen. Sowohl FileResponse
als auch FileIter
unterstützen auch eine close
Methode und werden daher wie erwartet bereinigt.
Als kleines Update zu dieser Antwort dachte ich, ich würde erklären, warum FileResponse
einen Dateipfad und keinen Dateizeiger nimmt.Das WSGI-Protokoll bietet Servern eine optionale Möglichkeit, einen optimierten Mechanismus zum Bereitstellen statischer Dateien über environ['wsgi.file_wrapper']
bereitzustellen. FileResponse
wird automatisch dies behandeln, wenn Ihr WSGI-Server diese Unterstützung bereitgestellt hat. In diesem Sinne ist es ein Gewinn, Ihre Daten in einer tmpfile auf einer Ramdisk zu speichern und FileResponse
mit dem vollständigen Pfad zu versehen, anstatt zu versuchen, einen Dateizeiger an FileIter
zu übergeben.
http://docs.pylonsproject.org/projects/pyramid/en/1.4-branch/api/response.html#pyramid.response.FileResponse
+1 Ich habe nicht bemerkt, dass es ein 'FileResponse'-Objekt gibt. Löscht es auch die Datei? Wenn nicht, würde es funktionieren, wenn der Pfad zur 'NamedTemporary' Datei an' FileResponse' übergeben wird, so dass die Datei nach dem Schließen gelöscht wird? –
'FileResponse' bietet keine Unterstützung für das Löschen von Dateien. Wenn 'NamedTemporaryFile' das Löschen der zugrunde liegenden Datei über die 'close'-Methode unterstützt, können Sie diese in einen 'FileIter' einbinden. –
Cool, ja standardmäßig 'NamedTemporaryFile' wird gelöscht, sobald es geschlossen ist :) –