我现在正在学习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方法。但是发生了什么?提前致谢!
答案 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"是一个非常有用的资源。