Как отключить проверку подлинности JANO CSRF?

Я прокомментировал 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