Django rest 框架 XLSX 渲染器 + Apiview
Django rest framework XLSX renderer + Apiview
我正在 API 上设置一个端点,它应该 return 和 XLSX-file。 DRF-docs 提到 https://github.com/wharton/drf-renderer-xlsx 作为主要的外部渲染包,除了 pandas 似乎也能够渲染 XLSX。
在他们的代码示例中,他们使用了一个 ReadOnlyViewset 和一个 mixin,但是没有提到它是如何与 APIViews 一起使用的。尽管如此,我还是想使用 APIView,如此 https://harshahegde.dev/rendering-xlsx-files-in-django-rest-framework-ckagk293p00eumks1bf4dlhie 所示
然而..
这在使用 CURL 或 Postman 时效果很好,但是当通过浏览器完成时我得到这个错误:
'Request' object has no attribute 'accepted_renderer'
据我了解,这是因为没有接受 header 集(例如 'Accept':'application/xlsx')
我通过从 renderer_classes 中删除 Mixin 来解决这个问题,所以它只是 return 一个名为“xlsx”的文件,但我不知道如何在没有 mixin 的情况下设置文件名。如何使用试图从浏览器访问 URL 的 APIView 设置文件名?
我的看法:
class SomedataXlsx(APIView):
renderer_classes = [XLSXRenderer, JSONRenderer]
def get(self, request):
queryset = Somedata.objects.all()
serializer = SomeDataSerializer(queryset, many=True)
return Response(serializer.data)
查看混合代码,很明显他们更改了 content-disposition header,因此由于 DRF Response() 采用 header 参数,我尝试更改它,它完美运行。
class SomedataXlsx(APIView):
renderer_classes = [XLSXRenderer, JSONRenderer]
def get(self, request):
user_sub_fund_data = Somedata.objects.all()
serializer = SomeDataSerializer(queryset, many=True)
return Response(serializer.data, headers={"content-disposition":"attachment; filename=mynewfilename.xlsx"})
我正在 API 上设置一个端点,它应该 return 和 XLSX-file。 DRF-docs 提到 https://github.com/wharton/drf-renderer-xlsx 作为主要的外部渲染包,除了 pandas 似乎也能够渲染 XLSX。
在他们的代码示例中,他们使用了一个 ReadOnlyViewset 和一个 mixin,但是没有提到它是如何与 APIViews 一起使用的。尽管如此,我还是想使用 APIView,如此 https://harshahegde.dev/rendering-xlsx-files-in-django-rest-framework-ckagk293p00eumks1bf4dlhie 所示 然而.. 这在使用 CURL 或 Postman 时效果很好,但是当通过浏览器完成时我得到这个错误:
'Request' object has no attribute 'accepted_renderer'
据我了解,这是因为没有接受 header 集(例如 'Accept':'application/xlsx') 我通过从 renderer_classes 中删除 Mixin 来解决这个问题,所以它只是 return 一个名为“xlsx”的文件,但我不知道如何在没有 mixin 的情况下设置文件名。如何使用试图从浏览器访问 URL 的 APIView 设置文件名?
我的看法:
class SomedataXlsx(APIView):
renderer_classes = [XLSXRenderer, JSONRenderer]
def get(self, request):
queryset = Somedata.objects.all()
serializer = SomeDataSerializer(queryset, many=True)
return Response(serializer.data)
查看混合代码,很明显他们更改了 content-disposition header,因此由于 DRF Response() 采用 header 参数,我尝试更改它,它完美运行。
class SomedataXlsx(APIView):
renderer_classes = [XLSXRenderer, JSONRenderer]
def get(self, request):
user_sub_fund_data = Somedata.objects.all()
serializer = SomeDataSerializer(queryset, many=True)
return Response(serializer.data, headers={"content-disposition":"attachment; filename=mynewfilename.xlsx"})