Я прокомментировал 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 в заголовки запрос будет успешным.
Что здесь происходит?
Ответ 1
Если вам просто нужны некоторые представления, чтобы не использовать CSRF, вы можете использовать @csrf_exempt
:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')
Вы можете найти больше примеров и других сценариев в документации Django:
Ответ 2
Чтобы отключить 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')
Ответ 3
В setting.py
в MIDDLEWARE вы можете просто удалить/прокомментировать эту строку:
'django.middleware.csrf.CsrfViewMiddleware',
Ответ 4
Ответ может быть неуместным, но я надеюсь, что это поможет вам
class DisableCSRFOnDebug(object):
def process_request(self, request):
if settings.DEBUG:
setattr(request, '_dont_enforce_csrf_checks', True)
Наличие промежуточного программного обеспечения помогает отлаживать запросы и проверять csrf на рабочих серверах.
Ответ 5
Для Django 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
.
Ответ 6
Проблема заключается в том, что 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
Затем импортируйте это промежуточное программное обеспечение в Middleware в 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',
]
Это работает с DRF на django 1.11
Ответ 7
Если вы хотите отключить его в 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
Ответ 8
CSRF может применяться на уровне представления, который не может быть отключен глобально.
В некоторых случаях это боль, но ум, "это для безопасности". Должны сохранить эти рейтинги AAA.
https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps
Ответ 9
Вы можете отключить CSRF, чтобы создать собственное промежуточное ПО:
Сделайте одно приложение django с именем "Core" и сделайте один файл "utils.py" в этом приложении и поместите ниже кода в этот файл:
class DisableCSRF(object):
def process_request(self, request):
setattr(request, '_dont_enforce_csrf_checks', True)
И включите это промежуточное программное обеспечение в файл settings.py в MIDDLEWARE_CLASSES.
'core.utils'
Еще один способ:
вы можете использовать @csrf_exempt decorator
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt