在 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_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]
【讨论】:
以上是关于在 Django 视图函数中动态定义渲染器类的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms MasterDetailPage 自定义渲染器
在 Forms UWP 中,自定义标题视图中的内容视图的后退导航无法与自定义渲染器一起正常工作
Request.GET 在自定义 HTML Django Rest Framework 渲染器模板中不可用