Wie die Rückkehr der generierten Datei-download mit Django REST Framework?
Muss ich zurück generierte Datei download als Django REST Framework Reaktion. Ich habe versucht, die folgenden:
def retrieve(self, request, *args, **kwargs):
template = webodt.ODFTemplate('test.odt')
queryset = Pupils.objects.get(id=kwargs['pk'])
serializer = StudentSerializer(queryset)
context = dict(serializer.data)
document = template.render(Context(context))
doc = converter().convert(document, format='doc')
res = HttpResponse(
FileWrapper(doc),
content_type='application/msword'
)
res['Content-Disposition'] = u'attachment; filename="%s_%s.zip"' % (context[u'surname'], context[u'name'])
return res
Aber es gibt ein msword-Dokument als json
.
Wie mache ich es starten Sie den Download als Datei statt?
- Sie sagen, Sie haben eine word-Datei, die Sie übergeben müssen, um Front-End, so dass Front-end-Benutzer sollte in der Lage, um es herunterzuladen?
- genau
- Vielleicht, nachdem die Datei erzeugt ist, wenn es öffentlich zugänglich von Ihrem web-server (ohne Django-code, Zulassung, etc), könnten Sie schicken eine 302-Redirect-Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser kann für Sie arbeiten:
Für FrontEnd-code finden Sie diese
yourFilePointer.write(response,text)
. Meine Datei ist bereits erzeugt und gespeichert auf dem server. Wastext
soll ich da schreiben?f = open('c:\file.doc', "w") f.write(text)
Hier ist ein Beispiel der Rückgabe einer Datei-download direkt aus DRF. Der trick ist, verwenden Sie eine benutzerdefinierte renderer, so dass Sie zurückkehren können, eine Antwort direkt aus der Ansicht:
Hinweis: ich bin mit einem benutzerdefinierten Endpunkt
download
anstelle der Standard-Endpunktretrieve
, denn so macht es einfach zu überschreiben, der renderer nur für diesen Endpunkt nicht für die ganze viewset -- und es neigt dazu, Sinn zu machen für Liste und detail zurück regelmäßige JSON sowieso. Wenn Sie wollte, um selektiv Rückkehr eine Datei herunterladen, Sie könnte noch mehr Logik auf die custom-renderer.Ich löste mein problem durch das speichern der Datei im media-Ordner und senden Sie den link an es auf front-end.
Und behandelt diese wie in meinem front-end (AngularJS SPA)