2016-08-01 40 views
5

Potrzebuję zwrócić wygenerowane pobranie pliku jako odpowiedź ramową RMS Django. Próbowałem następujące:Jak zwrócić wygenerowany plik do pobrania z Django REST Framework?

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 

ale zwraca dokumentu msword jak json.

Jak mogę zamiast tego zacząć pobierać jako plik?

+0

Chcesz powiedzieć, że utworzyłeś plik Word, które trzeba przekazać do Front End więc tym froncie użytkownika końcowego powinien móc go pobrać? –

+0

@ PiyushS.Wanare dokładnie – Viktor

+0

Może po wygenerowaniu pliku, jeśli jest publicznie dostępny z twojego serwera WWW (bez kodu Django, autoryzacji itp.), Możesz wysłać odpowiedź przekierowania 302. – Owen

Odpowiedz

1

mi rozwiązać mój problem, zapisując plik w folderze mediów i wysłanie linku nim do front-end.

@permission_classes((permissions.IsAdminUser,)) 
class StudentDocxViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet): 
    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') 
     p = u'docs/cards/%s/%s_%s.doc' % (datetime.now().date(), context[u'surname'], context[u'name']) 
     path = default_storage.save(p, doc) 
     return response.Response(u'/media/' + path) 

I obchodzić to jak w moim front-end (angularjs SPA)

$http(req).success(function (url) { 
    console.log(url); 
    window.location = url; 
}) 
2

ten może pracować dla Ciebie:

file_path = file_url 
FilePointer = open(file_path,"r") 
response = HttpResponse(FilePointer,content_type='application/msword') 
response['Content-Disposition'] = 'attachment; filename=NameOfFile' 

return response. 

Dla kodu frontend odnoszą this

+0

Nie otrzymuję tej linii 'twójPlikPointer.write (odpowiedź, tekst) '. Mój plik jest już wygenerowany i zapisany na serwerze. Jaki "tekst" powinienem tam napisać? – Viktor

+0

Tekst będzie tekstem twojego pliku tekstowego. –

+0

gdy piszemy plik tekstowy jak 'f = open ('c: \ file.doc'," w ") f.write (tekst)' –