【问题标题】:Django rest framework XLSX renderer + ApiviewDjango rest 框架 XLSX 渲染器 + Apiview
【发布时间】:2021-01-23 23:02:42
【问题描述】:

我正在我的 API 上设置一个端点,它应该返回一个 XLSX 文件。 DRF 文档提到 https://github.com/wharton/drf-renderer-xlsx 作为主要的外部渲染包,除了似乎也能够渲染 XLSX 的 pandas。

在他们的代码示例中,他们使用了与 mixin 配对的 ReadOnlyViewset,但没有提及它是如何与 APIViews 一起使用的。尽管如此,我还是想使用https://harshahegde.dev/rendering-xlsx-files-in-django-rest-framework-ckagk293p00eumks1bf4dlhie 所示的 APIView 然而.. 这在使用 CURL 或 Postman 时效果很好,但是当通过浏览器完成时,我得到了这个错误:

'Request' object has no attribute 'accepted_renderer'

据我了解,这是因为没有设置 Accept 标头(例如 'Accept':'application/xlsx') 我通过从 renderer_classes 中删除 Mixin 来解决这个问题,所以它只返回一个名为“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)

【问题讨论】:

    标签: django-rest-framework django-drf-renderer


    【解决方案1】:

    查看 mixin 代码,很明显他们更改了 content-disposition 标头,因此由于 DRF Response() 采用标头参数,我尝试更改它,并且效果很好。

    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"})
    

    【讨论】:

      猜你喜欢
      • 2016-06-20
      • 2021-01-16
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多