Django:当客户端请求未在视图类中定义的http方法时

时间:2016-06-21 00:29:36

标签: django http view

我现在正在学习django rest框架库。当我阅读教程时,我突然好奇如果客户端请求未在视图类中定义的http方法会发生什么。例如,如果我编写如下代码

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status


class SnippetList(APIView):
    """
    List all snippets, or create a new snippet.
    """
    def get(self, request, format=None):
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = SnippetSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

在这种情况下,我定义了" get"和"发布" View类中的方法。如果客户要求" put"或"删除"方法比发生什么?我读了django文档,它说View类使用dispatch()调度http方法。但是发生了什么?提前致谢!

1 个答案:

答案 0 :(得分:2)

您可以查看来源on Github。 dispatch方法检查使用了哪个HTTP谓词,并调用相应的函数,或者当动词无效/期望时返回405 - Method not allowed状态代码(http_method_not_allowed是基础中的django内置方法{ {1}}只返回View状态代码的类。

相关部分粘贴在下面:

405

基本上同样的事情是在django自己的观点中完成的(# Get the appropriate handler method if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed response = handler(request, *args, **kwargs) 中的dispatch):

django.views.generic.View

如果您使用django自己的视图类进行开发,"Classy Class-Based Views"是一个非常有用的资源。