【问题标题】:Conditionally return JSON or HTML response from Django django-rest-framework's view从 Django django-rest-framework 视图有条件地返回 JSON 或 HTML 响应
【发布时间】:2014-12-07 09:43:59
【问题描述】:

如何从 Django django-rest-framework 的视图有条件地返回 JSON 或 HTML 响应?

  1. djangorestframework == 2.3.10

  2. 我的settings.py

REST_FRAMEWORK = {
    'PAGINATE_BY': 10,
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.TemplateHTMLRenderer',
        'rest_framework.renderers.JSONRenderer',
    )
}
  1. 在我的url.py 中,我将其添加为最后一行:
urlpatterns = format_suffix_patterns(urlpatterns, allowed=['json', 'html'])
  1. 我的看法是这样的:
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'])

但它似乎也不起作用。

有人可以帮忙吗?谢谢!

【问题讨论】:

    标签: python html json django django-rest-framework


    【解决方案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 渲染器模板渲染器。 根据条件,您可以看到行为。

      【讨论】:

        猜你喜欢
        • 2019-11-09
        • 2018-03-24
        • 1970-01-01
        • 2013-04-09
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        相关资源
        最近更新 更多