【问题标题】:Django - Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` to be returned from the view, but received a `<class 'NoneType'>`Django - 期望从视图返回一个 `Response`、`HttpResponse` 或 `HttpStreamingResponse`,但收到了一个`<class 'NoneType'>`
【发布时间】:2020-10-04 23:44:46
【问题描述】:

为什么我会收到这个错误? 本应从视图返回 ResponseHttpResponseHttpStreamingResponse,但收到 &lt;class 'NoneType'&gt;我该如何解决?

我的主页/api/views.py

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

from Homepage.models import EducationLevel
from Homepage.api.serializers import EducationLevelSerializer

@api_view(['GET', ])
def api_detail_educationlevel(request):

  try:
    education = EducationLevel.objects.all()
  except EducationLevel.DoesNotExist:
    return Response(status=status.HTTP_400_BAD_REQUEST)

    if request.method == "GET":
      serializer = EducationLevelSerializer(education)
      return Response(serializer.data)

主页/api/serializers.py

from rest_framework import serializers
from Homepage.models import EducationLevel
class EducationLevelSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = EducationLevel
        field = ('Sequence', 'Description', 'Status')

我的主页/api/urls.py

from django.urls import path
from Homepage.api.views import api_detail_educationlevel

app_name='educationlevel'

urlpatterns = [
  path('', api_detail_educationlevel, name="detail"),
]

我的主要 urls.py

urlpatterns = [

    path('api/educationlevel/', include('Homepage.api.urls', 'educationlevel_api')),
]

更新

当我尝试这个时

def api_detail_educationlevel(request, slug):
      try:
        education = EducationLevel.objects.get(id=slug)
      except EducationLevel.DoesNotExist:
        return Response(status=status.HTTP_400_BAD_REQUEST)

我收到这个错误

【问题讨论】:

  • @Compro Prasad no
  • 很抱歉,您可以为此打开另一个问题。我不认为我们是来回答所有问题的。你试图滥用提问的特权。只需尝试查看您的问题并通过连接点来解决它。您可以在代码中的某些地方使用import pdb; pdb.set_trace() 来尝试哪些有效,哪些无效。

标签: python django django-rest-framework


【解决方案1】:

您的视图需要返回 HttpResponse 对象,但您的代码不需要。

@api_view(['GET', ])
def api_detail_educationlevel(request):
    try:
        education = EducationLevel.objects.all()
    except EducationLevel.DoesNotExist:
        return Response(status=status.HTTP_400_BAD_REQUEST)
    if request.method == "GET":
        serializer = EducationLevelSerializer(education)
        return Response(serializer.data)

if 语句应该写在except 块之外。容易忽略的小问题。

上面的代码也有些多余。装饰器@api_view(['GET']) 无论如何都会检查request.method 是否具有GET 的值。因此,您可以删除多余的检查。生成的代码将变为:

@api_view(['GET', ])
def api_detail_educationlevel(request):
    try:
        education = EducationLevel.objects.all()
    except EducationLevel.DoesNotExist:
        return Response(status=status.HTTP_400_BAD_REQUEST)
    serializer = EducationLevelSerializer(education)
    return Response(serializer.data)

编辑:正如@youngminz 所指出的,如果您在没有任何过滤条件的情况下获取所有对象,则不需要进行异常处理。

【讨论】:

    【解决方案2】:

    原因是您的例外块。在您的回复中,您没有传递任何数据,而只是传递了状态。我建议将一个空字符串作为带有状态的数据传递

    【讨论】:

    • 我该怎么做?即使我有这个? "" 教育 = EducationLevel.objects.all() ""
    【解决方案3】:

    您所说的错误是视图的返回值为 None 时。

    @api_view(['GET', ])
    def api_detail_educationlevel(request):
    
      try:
        education = EducationLevel.objects.all()
    

    上面的代码EducationLevel.objects.all() 永远不会引发EducationLevel.DoesNotExist 异常,因为Django Queryset 会进行惰性求值。所以,下面的异常处理过程没有执行。

      except EducationLevel.DoesNotExist:
        return Response(status=status.HTTP_400_BAD_REQUEST)
    
        if request.method == "GET":
          serializer = EducationLevelSerializer(education)
          return Response(serializer.data)
    

    ...在python中,如果函数没有指定返回值,则返回None。这就是引发Expected a Response, HttpResponse or HttpStreamingResponse to be returned from the view, but received a &lt;class 'NoneType'&gt; 错误的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2021-10-18
      相关资源
      最近更新 更多