2013-05-09 7 views
68

Я закомментирована CSRF процессора и промежуточного слоя линии в settings.py:Как отключить проверку CSRF Django?

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 в заголовки, запрос будет успешным.

Что здесь происходит?

+0

Возможный дубликат: http://stackoverflow.com/questions/1650941/django-csrf-framework-cannot-be-disabled-and-is-breaking-my-site – Rohan

ответ

149

Если вам просто нужно некоторые точки зрения не использовать CSRF, вы можете использовать @csrf_exempt:

from django.views.decorators.csrf import csrf_exempt 

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

Вы можете найти больше примеров и других сценариев здесь:

+2

Привет, @TheBronx, я действительно хочу знайте, почему мое решение не работает. – MrROY

+1

sorry @MrROY Я не знаю, почему ваше решение не работает. Я просто знаю, что '@ csrf_exemp' работает, поскольку я использовал его недавно без проблем. Надеюсь, вы найдете ответ. – TheBronx

+3

@MrROY, Это вещь Django. Большинство вещей работают/не работают только потому, что есть волшебный параметр, глубоко погруженный в базу кода. – idursun

9

Ответ может быть неуместным, но я надеюсь, что это помогает вам

class DisableCSRFOnDebug(object): 
    def process_request(self, request): 
     if settings.DEBUG: 
      setattr(request, '_dont_enforce_csrf_checks', True) 

Имея промежуточное программное обеспечение, как это помогает для отладки запросов и проверить CSRF на производственных серверах.

+0

Хмм. Пробовал это в Django 1.9.1. Удалил обработчик @csrf_exempt из метода и добавил код выше. Получил 403, потому что cookie не был установлен. –

19

Чтобы отключить CSRF для просмотра на основе классов, для меня это работало.
Использование Джанго 1.10 и питон 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',

+2

Не работает для меня – Nirri

4

Если вы хотите отключить его в Global, вы можете написать собственный Middleware, как это

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

+0

Это работает, спасибо – Nirri

5

Вы можете отключить CSRF, чтобы сделать свой собственный промежуточное программное обеспечение:

Сделать один Джанго приложение с именем «ядра», и сделать один файл «utils.py» на этом приложении и помещается ниже код на этот файл:

class DisableCSRF(object): 
    def process_request(self, request): 
     setattr(request, '_dont_enforce_csrf_checks', True) 

Включите это промежуточное программное обеспечение в файл settings.py в MIDDLEWARE_CLASSES.

'ядро.более

Один из способов Utils':

вы можете использовать @csrf_exempt декоратора

from django.views.decorators.csrf import csrf_exempt 
@csrf_exempt 
0

Проблема здесь состоит в том, что 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/средний .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', 

] 

это работает с ФПИ на Джанго 1.11

3

Для 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.

Смежные вопросы