在 Django 视图函数中动态定义渲染器类

Posted

技术标签:

【中文标题】在 Django 视图函数中动态定义渲染器类【英文标题】:Define renderer class dynamically in Django view function 【发布时间】:2021-09-01 00:59:27 【问题描述】:

如何根据某些条件在 Djanog 旧 api_view 函数中定义渲染器类?拥有这样的东西:

@api_view(['GET'])
def can_render_2_things(request):
    if some_comdition:
       renderer_classes = [PDFRenderer]
    else:
       renderer_classes = [JSONRenderer]

【问题讨论】:

【参考方案1】:

从 Django docs 你可以使用不同的响应对象:

from django.http import FileResponse, JsonResponse
@api_view(['GET'])
def can_render_2_things(request):
    if some_comdition:
       response = FileResponse(open('myfile.png', 'rb'))
    else:
       response = JsonResponse('foo': 'bar', encoder=myJsonEncoder)

【讨论】:

【参考方案2】:

如果您要设置的renderer_classes 列表包含只有一个 渲染器类,您可以自己在request 上设置属性accepted_rendereraccepted_media_type。这将导致使用正确的渲染器:

@api_view(['GET'])
def can_render_2_things(request):
    if some_comdition:
       request.accepted_renderer = PDFRenderer
       request.accepted_media_type = PDFRenderer.media_type
    else:
       request.accepted_renderer = JSONRenderer
       request.accepted_media_type = JSONRenderer.media_type

但是如果你想设置更多的渲染,这不是很有用,我建议你简单地使用基于类的视图而不是基于函数的视图,并使用APIView

from rest_framework.views import APIView


class CanRender2Things(APIView):
    def get(self, request, format=None):
        if some_comdition:
            self.renderer_classes = [PDFRenderer]
        else:
            self.renderer_classes = [JSONRenderer]

【讨论】:

以上是关于在 Django 视图函数中动态定义渲染器类的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms 渲染器未响应事件更改

Xamarin.Forms MasterDetailPage 自定义渲染器

在 Forms UWP 中,自定义标题视图中的内容视图的后退导航无法与自定义渲染器一起正常工作

Request.GET 在自定义 HTML Django Rest Framework 渲染器模板中不可用

如何在视图 Django 中更改渲染以返回 json [重复]

等待 GLContext 被释放