【问题标题】:How to use a custom renderer based on request params?如何使用基于请求参数的自定义渲染器?
【发布时间】:2017-12-12 21:37:14
【问题描述】:

目标:

让每个端点在参数中使用export=csv,通过使用自定义渲染器而不是更改每个视图的代码来输出 CSV 文件而不是 Json 数据


设置另一个渲染器似乎是最简单的解决方案:

class MyView(ListAPIView):
    renderer_classes = (BrowsableAPIRenderer, CSVRenderer)
    pagination_class = StandardPagination
    serializer_class = MySerializer
    ...

CSVRenderer 上检查url 是否包含export=csv,但这会产生CSV 格式的纯文本数据,而不是文件。删除BrowsableAPIRenderer 会起作用,但我仍然需要让端点在没有export=csv 的情况下工作。

有没有办法在调用渲染器之前检查 url?

如果有更好的方法来实现这一点,欢迎提出建议。


编辑:我的渲染器是来自 djangorestframework 的 CSVRenderer:

from rest_framework_csv import renderers as r

class CSVRenderer(r.CSVRenderer):
    pass

Edit2:StandardPagination 只是一个rest_framework.pagination.PageNumberPagination

【问题讨论】:

    标签: django csv django-rest-framework django-views


    【解决方案1】:

    有一个名为djangorestframework-csv 的包可能值得一看。我相信它可以实现您想要实现的目标。它列在Django Rest Framework documentation 中的CSV rendering section 下。

    编辑: 你能显示StandardPagination的代码吗? 您也可以尝试将 GET 参数设置为format,例如http://<domain>/<url to view>/?format=csv?

    编辑: 我已经通过以下方式复制了你的代码,序列化程序和查询集不同,因为我没有你的:

    from rest_framework_csv import renderers as r
    from rest_framework.generics import ListAPIView
    from rest_framework.renderers import BrowsableAPIRenderer
    from rest_framework.pagination import PageNumberPagination
    
    from .. import Account, AccountSerializer
    
    
    class PageNumberPagination2(PageNumberPagination):
        page_size = 2
    
    
    class CSVRenderer(r.CSVRenderer):
        pass
    
    
    class MyView(ListAPIView):
        renderer_classes = (BrowsableAPIRenderer, CSVRenderer)
        pagination_class = PageNumberPagination2
        queryset = Account.objects.all()
        serializer_class = AccountSerializer
    

    urls.py 中,我添加了模式url(r'^test/', MyView.as_view()),。当去/test/ 我得到可浏览的视图和/test/?format=csv CSV 文件。

    您能否确认这是与您的设置等效的设置,并且您没有在 URL 周围使用 format_suffix_patterns

    【讨论】:

    • 感谢您的回答。我的 CSVRenderer 已经从这个库中扩展了渲染器,但是仍然存在同样的问题,基本上是忽略了基于 url 参数的其他渲染器。
    • 能否提供您的扩展渲染器?
    • 通过 ?format=csv 奇怪地返回 404。StandardPagination 只是一个 rest_framework.pagination.PageNumberPagination
    • 404 很奇怪; format 是更改格式的默认后缀,如django-rest-framework.org/api-guide/format-suffixes/… 所示,您是否碰巧将其修改为export
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2019-11-02
    • 2015-03-29
    • 1970-01-01
    • 2012-09-13
    • 2020-10-28
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多