How to return generated file download with Django REST Framework? How to return generated file download with Django REST Framework? python python

How to return generated file download with Django REST Framework?


Here's an example of returning a file download directly from DRF. The trick is to use a custom renderer so you can return a Response directly from the view:

from django.http import FileResponsefrom rest_framework import viewsets, renderersfrom rest_framework.decorators import actionclass PassthroughRenderer(renderers.BaseRenderer):    """        Return data as-is. View should supply a Response.    """    media_type = ''    format = ''    def render(self, data, accepted_media_type=None, renderer_context=None):        return dataclass ExampleViewSet(viewsets.ReadOnlyModelViewSet):    queryset = Example.objects.all()    @action(methods=['get'], detail=True, renderer_classes=(PassthroughRenderer,))    def download(self, *args, **kwargs):        instance = self.get_object()        # get an open file handle (I'm just using a file attached to the model for this example):        file_handle = instance.file.open()        # send file        response = FileResponse(file_handle, content_type='whatever')        response['Content-Length'] = instance.file.size        response['Content-Disposition'] = 'attachment; filename="%s"' % instance.file.name        return response

Note I'm using a custom endpoint download instead of the default endpoint retrieve, because that makes it easy to override the renderer just for this endpoint instead of for the whole viewset -- and it tends to make sense for list and detail to return regular JSON anyway. If you wanted to selectively return a file download you could add more logic to the custom renderer.


This may work for you:

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

For FrontEnd code refer this


I am using DRF and i found a view code to download file, which would be like

from rest_framework import genericsfrom django.http import HttpResponsefrom wsgiref.util import FileWrapperclass FileDownloadListAPIView(generics.ListAPIView):    def get(self, request, id, format=None):        queryset = Example.objects.get(id=id)        file_handle = queryset.file.path        document = open(file_handle, 'rb')        response = HttpResponse(FileWrapper(document), content_type='application/msword')        response['Content-Disposition'] = 'attachment; filename="%s"' % queryset.file.name        return response

and url.py will be

path('download/<int:id>/',FileDownloadListAPIView.as_view())

I am using React.js in frontend and i get a response like

handleDownload(id, filename) {  fetch(`http://127.0.0.1:8000/example/download/${id}/`).then(    response => {      response.blob().then(blob => {      let url = window.URL.createObjectURL(blob);      let a = document.createElement("a");      console.log(url);      a.href = url;      a.download = filename;      a.click();    });  });}

and after i got successful in downloading a file which also opens correctly and i hope this gonna work. Thanks