2014-02-27 4 views
1

DjangoRestFramework를 사용하여 API를 만들고 있습니다. 현재 OAuth2 인증이 작동합니다. 즉, API를 사용하기위한 유효한 액세스 토큰을 생성 할 수 있습니다.DjangoRestFramework 업로드 파일 'CSRF Verification Failed'

어떻게 사용자 파일을 업로드하나요? 파일을 업로드하고 파일을 업로드 한 사용자에게 연결해야합니다.

나는 현재 이런 식으로 일을하려고

API/views.py 오전 :

class FileUploadView(APIView): 
    parser_classes = (FileUploadParser,) 

    def put(self, request, filename, format=None): 
     file_obj = request.FILES['file'] 
     # do stuff 
     return Response(status=204) 

API/urls.py이 줄이 포함되어

url(r'^files/', 'api.views.FileUploadView'), 

을하지만 난 때 파일을 업로드 할 때 다음과 같은 오류가 표시됩니다.

'CSRF verification failed. Request aborted' 
'Reason given for failure: CSRF cookie not set' 

나는이 curl 명령하려고하면 당신이 SessionAuthentication를 사용하는 경우 당신은 CSRF가 토큰을 유효한 포함해야합니다 "를 Django REST Framework Documentation

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',), 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.OAuth2Authentication', 
    ) 
} 
+0

는 https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#exceptions – user1168095

답변

2

,939 :이 같은 모습 뭔가를해야 내 원래의 코드에서

1) 내보기에 와서 파일 이름 매개 변수를 예상하고 있었다 그러나 나는 urls.py.의 URL에서 그것을 구문 분석되지 않았다3210

2) 저는 APIView를 뷰로 제공하지 않았습니다. 위에서 확인한 경우 .as_view() 메서드를 특별히 호출합니다.

위의 고정 및 PUT 대신 POST 구현 내 코드가 예상대로 작동합니다. 여기에 내 현재 APIView입니다 :

class UploadsView(APIView): 

    parser_classes = (FileUploadParser,) 
    permission_classes = (permissions.IsAuthenticated,) 

    def post(self, request, format=None): 
     file_obj = request.FILES['file'] 
     print("FILE OBJ: ", file_obj) 
     return Response(status=201) 
0

: 여기

curl -XPUT http://localhost:8000/files/ -H 'Authorization: Bearer some_access_token' -F [email protected] 

내 REST_FRAMEWORK의 기본값입니다을 POST, PUT, PATCH 또는 DELETE 조작. Django documentation에 설명 된대로

AJAX 요청을하려면, HTTP 헤더에 CSRF 토큰을 포함해야 "또는

, 당신이보기 CSRF Exempt을 시도 할 수 있습니다.

from django.utils.decorators import method_decorator 
from django.views.decorators.csrf import csrf_exempt 

class FileUploadView(APIView): 
    parser_classes = (FileUploadParser,) 

    @method_decorator(csrf_exempt) 
    def dispatch(self, request, *args, **kwargs): 
     return super(FileUploadView, self).dispatch(request, *args, **kwargs) 

    def put(self, request, filename, format=None): 
     file_obj = request.FILES['file'] 
     # do stuff 
     return Response(status=204) 
+0

파견() 메소드는 내부적으로 이미 csrf_exempt이며, 필요하지 않는다을 참조하십시오 너 자신. 또한 OAuth2Authentication을 SessionAuthentication이 아니라 기본적으로 사용하고 있습니다. 내 솔루션을 게시했습니다. – arnm

관련 문제