csrf 프로세서 및 미들웨어 라인을 주석 처리했습니다 settings.py
.
122
123 TEMPLATE_CONTEXT_PROCESSORS = (
124 'django.contrib.auth.context_processors.auth',
125 # 'django.core.context_processors.csrf',
126 'django.core.context_processors.request',
127 'django.core.context_processors.static',
128 'cyathea.processors.static',
129 )
130
131 MIDDLEWARE_CLASSES = (
132 'django.middleware.common.CommonMiddleware',
133 'django.contrib.sessions.middleware.SessionMiddleware',
134 # 'django.middleware.csrf.CsrfViewMiddleware',
135 'django.contrib.auth.middleware.AuthenticationMiddleware',
136 'django.contrib.messages.middleware.MessageMiddleware',
137 'django.middleware.locale.LocaleMiddleware',
138 # Uncomment the next line for simple clickjacking protection:
139 # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
140 )
그러나 Ajax를 사용하여 요청을 보낼 때 Django는 여전히 ‘csrf 토큰이 잘못되었거나 없습니다’라고 응답하고 X-CSRFToken을 헤더에 추가하면 요청이 성공합니다.
여기서 무슨 일이 일어나고 있습니까?
답변
CSRF를 사용하지 않는 뷰가 필요한 경우 다음을 사용할 수 있습니다 @csrf_exempt
.
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')
Django 문서에서 더 많은 예제와 다른 시나리오를 찾을 수 있습니다.
답변
클래스 기반 뷰에 대해 CSRF를 비활성화하려면 다음이 저에게 효과적이었습니다.
Django 1.10 및 Python 3.5.2 사용
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt, name='dispatch')
class TestView(View):
def post(self, request, *args, **kwargs):
return HttpResponse('Hello world')
답변
setting.py
MIDDLEWARE 에서는 간단히 다음 줄을 제거 / 주석 할 수 있습니다.
'django.middleware.csrf.CsrfViewMiddleware',
답변
대한 장고 2 :
from django.utils.deprecation import MiddlewareMixin
class DisableCSRF(MiddlewareMixin):
def process_request(self, request):
setattr(request, '_dont_enforce_csrf_checks', True)
settings.MIDDLEWARE
해당 되는 경우 해당 미들웨어를 추가해야합니다 (예 : 테스트 설정).
참고 : 설정은 MIDDLEWARE_CLASSES
더 이상 호출되지 않습니다 .
답변
답변이 부적절 할 수 있지만 도움이 되었기를 바랍니다.
class DisableCSRFOnDebug(object):
def process_request(self, request):
if settings.DEBUG:
setattr(request, '_dont_enforce_csrf_checks', True)
이와 같은 미들웨어를 사용하면 요청을 디버그하고 프로덕션 서버에서 csrf를 확인하는 데 도움이됩니다.
답변
여기서 문제는 SessionAuthentication이 자체 CSRF 유효성 검사를 수행한다는 것입니다. 그렇기 때문에 CSRF 미들웨어가 주석 처리 된 경우에도 CSRF 누락 오류가 발생합니다. 모든 뷰에 @csrf_exempt를 추가 할 수 있지만 CSRF를 비활성화하고 전체 앱에 대한 세션 인증을 원하면 다음과 같은 추가 미들웨어를 추가 할 수 있습니다.
class DisableCSRFMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
setattr(request, '_dont_enforce_csrf_checks', True)
response = self.get_response(request)
return response
myapp / middle.py에이 클래스를 만든 다음 settings.py의 미들웨어에서이 미들웨어를 가져옵니다.
MIDDLEWARE = [
'django.middleware.common.CommonMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'myapp.middle.DisableCSRFMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
그것은 django 1.11에서 DRF와 함께 작동합니다.
답변
Global에서 비활성화하려면 다음과 같이 사용자 정의 미들웨어를 작성할 수 있습니다.
from django.utils.deprecation import MiddlewareMixin
class DisableCsrfCheck(MiddlewareMixin):
def process_request(self, req):
attr = '_dont_enforce_csrf_checks'
if not getattr(req, attr, False):
setattr(req, attr, True)
그런 다음이 클래스 youappname.middlewarefilename.DisableCsrfCheck
를 MIDDLEWARE_CLASSES
목록에 추가하십시오.django.middleware.csrf.CsrfViewMiddleware
