Comentei as linhas de processador csrf e middleware em 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 )
Mas quando eu uso Ajax para enviar uma solicitação, o Django ainda responde 'token csrf está incorreto ou ausente', e depois de adicionar X-CSRFToken aos cabeçalhos, a solicitação seria bem-sucedida.
O que está acontecendo aqui ?
Respostas:
Se você só precisa de algumas visualizações para não usar o CSRF, pode usar
@csrf_exempt
:Você pode encontrar mais exemplos e outros cenários na documentação do Django:
fonte
@csrf_exemp
funciona como usei recentemente sem problemas. Espero que você encontre a resposta.Para desabilitar CSRF para visualizações baseadas em classe, o seguinte funcionou para mim.
Usando django 1.10 e python 3.5.2
fonte
No
setting.py
MIDDLEWARE você pode simplesmente remover / comentar esta linha:fonte
Para Django 2 :
Esse middleware deve ser adicionado
settings.MIDDLEWARE
quando apropriado (nas configurações de teste, por exemplo).Nota: a configuração não é
MIDDLEWARE_CLASSES
mais chamada .fonte
A resposta pode ser inadequada, mas espero que ajude você
Ter um middleware como esse ajuda a depurar solicitações e verificar o csrf em servidores de produção.
fonte
O problema aqui é que SessionAuthentication executa sua própria validação CSRF. É por isso que você obtém o erro CSRF missing mesmo quando o CSRF Middleware é comentado. Você poderia adicionar @csrf_exempt a cada visão, mas se quiser desabilitar o CSRF e ter autenticação de sessão para todo o aplicativo, você pode adicionar um middleware extra como este -
Eu criei esta classe em myapp / middle.py Em seguida, importe este middleware no Middleware em settings.py
Isso funciona com DRF no django 1.11
fonte
Se você quiser desabilitá-lo no Global, você pode escrever um middleware personalizado, como este
em seguida, adicione esta classe
youappname.middlewarefilename.DisableCsrfCheck
àsMIDDLEWARE_CLASSES
listas, antesdjango.middleware.csrf.CsrfViewMiddleware
fonte
O CSRF pode ser aplicado no nível da visualização, que não pode ser desabilitado globalmente .
Em alguns casos, isso é uma dor, mas hum, "é para segurança". Tenho que manter essas classificações AAA.
https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps
fonte
@WoooHaaaa alguns pacotes de terceiros usam o middleware 'django.middleware.csrf.CsrfViewMiddleware'. por exemplo, eu uso django-rest-oauth e tenho problemas como você mesmo depois de desabilitar essas coisas. talvez esses pacotes tenham respondido ao seu pedido como o meu caso, porque você usa decorador de autenticação e algo assim.
fonte