2016-06-21 2 views
2

지금 장고 프레임 워크 라이브러리를 배우고 있습니다. 그리고 튜토리얼을 읽을 때 클라이언트가 뷰 클래스에 정의되지 않은 http 메소드를 요청하면 어떻게되는지 궁금하다. 예를 들어 내가보기 클래스의 "수"와 "후"메소드를 정의이 경우 Django : 클라이언트가 뷰 클래스에 정의되지 않은 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) 

아래처럼 코드를 작성합니다. 클라이언트가 "put"또는 "delete"메소드를 요청하면 어떻게됩니까? 나는 django 문서를 읽고 dispatch()를 사용하여 View 클래스가 http 메서드를 전달한다고 말했다. 그러나 무슨 일이 일어나고 있는가? 미리 감사드립니다!

답변

2

소스 on Github을 살펴볼 수 있습니다. 디스패치 메소드는 동사가 사용/사용되지 않을 때 어떤 동사가 사용 된 HTTP 동사를 확인하고 적절한 함수를 호출하거나 405 - Method not allowed 상태 코드를 반환합니다 (http_method_not_allowed405 상태 코드를 반환하는 View 클래스의 django 기본 제공 메서드입니다.). 만약 당신이 개발하는 경우

def dispatch(self, request, *args, **kwargs): 
    # Try to dispatch to the right method; if a method doesn't exist, 
    # defer to the error handler. Also defer to the error handler if the 
    # request method isn't on the approved list. 
    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 
    return handler(request, *args, **kwargs) 

: 본질적으로 같은 일이 (django.views.generic.View에서 dispatch) 장고 자신의 견해에서 이루어집니다

# 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) 

:

관련 부분은 아래에 붙여 django의 자체 뷰 클래스를 사용하면 "Classy Class-Based Views"은 매우 유용한 리소스입니다.

+0

내 예제에서 클라이언트가 "put"또는 "delete"HTTP 메소드를 요청하면 오류 페이지가 반환됩니까? – nextdoordoc

+0

예, 이러한 메서드를 정의하지 않으면 오류가 반환됩니다. – Anonymous

+0

마침내 나는 고마워한다!! :) – nextdoordoc

관련 문제