从 Django django-rest-framework 视图有条件地返回 JSON 或 HTML 响应
Posted
技术标签:
【中文标题】从 Django django-rest-framework 视图有条件地返回 JSON 或 HTML 响应【英文标题】:Conditionally return JSON or HTML response from Django django-rest-framework's view 【发布时间】:2014-12-07 09:43:59 【问题描述】:如何从 Django django-rest-framework 的视图有条件地返回 JSON 或 html 响应?
djangorestframework
== 2.3.10
我的settings.py
:
REST_FRAMEWORK =
'PAGINATE_BY': 10,
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.TemplateHTMLRenderer',
'rest_framework.renderers.JSONRenderer',
)
-
在我的
url.py
中,我将其添加为最后一行:
urlpatterns = format_suffix_patterns(urlpatterns, allowed=['json', 'html'])
-
我的看法是这样的:
def myview(request, id, format='json'):
if format == 'json' or format is None:
return Response(my_dict, status=status.HTTP_200_OK)
else:
return Response(my_dict, template_name='myhtml.html')
如果我在 url 请求中明确使用 .html
或 .json
format_prefix
,一切正常。但如果我不指定任何格式,它会给我以下错误。
在 /objects/29 处配置不正确 返回了一个没有设置
template_name
属性的模板响应 视图或响应 请求方法:GET 请求网址:localhost:8000/objects/29 Django 版本:1.7 异常类型:配置不当 异常值:返回没有template_name
的模板响应 在视图或响应上设置的属性 异常位置:D:\WORKSPACE\user...\lib\site-
我也试过了:
urlpatterns = format_suffix_patterns(urlpatterns, allowed=['json', 'html', 'None'])
但它似乎也不起作用。
有人可以帮忙吗?谢谢!
【问题讨论】:
【参考方案1】:这对我有用:
class MyView(ListAPIView):
renderer_classes = (JSONRenderer, TemplateHTMLRenderer,)
def get(self, request, *args, **kwargs):
data = SomerSerializer([]).data
if request.accepted_renderer.format == 'html':
return Response(data, template_name='blah.html')
return Response(data)
仅供参考,我之前也遇到过这个错误,但这并不是因为它配置正确——而是因为一些不相关的代码就在它出错之前——所以寻找其他可能失败的东西。另请注意,您的“其他”是多余的。
【讨论】:
【参考方案2】:经过研究,这对我有用 下面的django视图充当模板渲染器和json渲染器
views.py
from rest_framework.renderers import JSONRenderer, TemplateHTMLRenderer
from rest_framework.decorators import api_view, renderer_classes
from django.http.response import JsonResponse
from django.shortcuts import render
@api_view(['GET','POST'])
@renderer_classes([JSONRenderer,TemplateHTMLRenderer])
def myview(request, id, format='json'):
if format == 'json' or format is None:
return JsonResponse(my_dict, status=status.HTTP_200_OK)
else:
return render(request,'template_name.html',"context":my_dict)
settings.py
REST_FRAMEWORK =
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.TemplateHTMLRenderer',
),
上述视图的作用类似于 Json 渲染器 和 模板渲染器。 根据条件,您可以看到行为。
【讨论】:
以上是关于从 Django django-rest-framework 视图有条件地返回 JSON 或 HTML 响应的主要内容,如果未能解决你的问题,请参考以下文章