【问题标题】:Django REST framework JSONParser().parse(request) raising errorDjango REST 框架 JSONParser().parse(request) 引发错误
【发布时间】:2019-10-07 19:59:19
【问题描述】:

在 Django 视图中,我正在尝试这个-

@csrf_exempt
def customer_list(request):
    """
    List all customers, or create a new customer.
    """
    if request.method == 'GET':
        snippets = Customer.objects.all()
        serializer = CustomerSerializer(snippets, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = CustomerSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

在从邮递员那里发布数据时,我得到了

JSON 解析错误 - 预期值:第 1 行第 1 列 (char 0)

【问题讨论】:

  • 如果您使用的是 DRF,为什么要编写一个普通的 Django 视图而不是 DRF 视图?至少你应该用api_view来装饰你的函数。
  • 我是 django rest 新手,感谢您的信息

标签: python django django-rest-framework


【解决方案1】:

问题是您将整个请求对象传递给 JSON 解析器,而不是包含实际 JSON 内容的主体。

但无论如何你都不应该自己做这件事。让 DRF 为您完成。

from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view()
def customer_list(request):
    """
    List all customers, or create a new customer.
    """
    if request.method == 'GET':
        snippets = Customer.objects.all()
        serializer = CustomerSerializer(snippets, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = CustomerSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

或者更好的是,使用基于类的视图,它已经为您提供了所有这些功能:

from rest_framework import generics

class CustomerList(generics.ListCreateAPIView):
     model = Customer
     serializer_class = CustomerSerializer

这就是你所需要的。

【讨论】:

  • 令我惊讶的是this snippet(与 OP 的 sn-p 非常相似)工作正常。在这个 sn-p 中,整个 request 对象被解析。
猜你喜欢
  • 2014-09-03
  • 2016-05-28
  • 2015-01-26
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 2014-09-16
相关资源
最近更新 更多