【问题标题】:Define renderer class dynamically in Django view function在 Django 视图函数中动态定义渲染器类
【发布时间】: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]
【问题讨论】:
标签:
python
django
django-views
renderer
【解决方案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_renderer 和accepted_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]