2012-07-07 1 views
22

API URL이 사용자 대면 URL과 동일한 장고에 사이트를 작성하려고합니다. 하지만 POST 요청과 CSRF 보호를 사용하는 페이지에 문제가 있습니다. 예를 들어 페이지/foo/add가있는 경우 다음 두 가지 방법으로 POST 요청을 보낼 수 있습니다.어떤 경우에만 장고의 csrf 보호를 비활성화 할 수 있습니까?

  1. 양식을 제출하는 최종 사용자 (세션 쿠키를 사용하여 인증 됨). 이를 위해서는 CSRF 보호가 필요합니다.
  2. API 클라이언트 (HTTP 요청 헤더를 사용하여 인증 됨). CSRF 보호가 활성화되어 있으면이 작업은 실패합니다.

@csrf_exempt와 같이 CSRF를 사용하지 못하게하는 여러 가지 방법이 있지만 전체보기에서이 기능을 사용할 수 없습니다. 좀 더 세분화 된 수준에서 활성화/비활성화 할 수있는 방법이 있습니까? 아니면 CSRF 보호를 처음부터 구현해야 할 것인가?

+1

[csrf protection docs] (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/)를 확인 했습니까? – machaku

+0

나는 그걸 읽었지만 모든 시나리오를 읽지는 않았다. 감사! – lucas

답변

22

해결책을 설명하는 Django의 CSRF 보호 문서 섹션 View needs protection for one path이 있습니다. 전체보기에서 @csrf_exempt을 사용하는 것이지만 API 클라이언트 헤더가 없거나 유효하지 않은 경우 에 @csrf_protect으로 주석 된 함수를 호출하십시오.

30

수정 urls.py

당신이 urls.py에 경로를 관리하는 경우, 당신은 CSRF 검증 미들웨어에서 제외 할 csrf_exempt()에 원하는 경로를 포장 할 수 있습니다. 예를 들어

,

from django.views.decorators.csrf import csrf_exempt 
urlpatterns = patterns(
    # ... 
    # Will exclude `/api/v1/test` from CSRF 
    url(r'^api/v1/test', csrf_exempt(TestApiHandler.as_view())) 
    # ... 
) 

또는, 실내 장식

일부는 자신의 요구

예를 들어

에 더 적합한 @csrf_exempt 장식의 사용을 찾을 수 있습니다로,

from django.views.decorators.csrf import csrf_exempt 
from django.http import HttpResponse 

@csrf_exempt 
def my_view(request): 
    return HttpResponse('Hello world')