Erro do token 403 do formulário CSRF do Django 1.9 AJAX - “cookie CSRF não definido”
Eu já vi muito sobre isso no SO, mas nada pode resolver meu problema.
Problema:
Com o middleware CSRF ativado, o Django responde com 403 na solicitação de formulário AJAX, informando:
"Cookie CSRF não definido."
Seguindo odocumentação, foi implementada uma funcionalidade JS, que configura"X-CSRFToken" cabeçalho.
Funciona como esperado, obtém"csrftoken" cookie do navegador e o publica junto com a solicitação AJAX:
x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2
Mas a resposta ainda é 403.
Soluções experimentadas:
Eu tentei tudo o que pude encontrar no SO ou na web, especificamente:
Verificando se o middleware está ativado:
MIDDLEWARE_CLASSES = [
...
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
...
]
Navegadores diferentes com cookies ativados;
Decorando minha vista com@ensure_csrf_cookie
;
Configuração{% csrf_token %}
no meu modelo;
Usandorender
atalho que leva o contexto de solicitação correto;
Definir personalizadoCSRF_COOKIE_NAME
eCSRF_HEADER_NAME
no meusettings.py
;
Configuração explicitamenteCSRF_COOKIE_SECURE = False
eCSRF_COOKIE_HTTPONLY = False
;
Configuração explicitamenteCSRF_TRUSTED_ORIGINS
configuração;
Teste no servidor de desenvolvimento e produção;
Atérequest.META["CSRF_COOKIE_USED"] = True
na minha opinião, como alguém sugeriu.
E ainda não conseguiu nada.
Cabeçalhos:
Se eu usar@csrf_exempt
eprint(request.META)
na minha opinião, é claro que o cabeçalho personalizado"X-CSRFToken" está presente no pedido e formatado de acordo com a documentação do Django, com o prefixo "HTTP_", substituindo hífens por sublinhados, todos em maiúsculas:"HTTP_X_CSRFTOKEN".
Ainda mais, seu valor corresponde ao cookie definido pelo Django.
Biscoitos:
O estranho é que, se eu tentarprint(request.COOKIES)
na minha opinião, na página e no formulário, posso ver"csrftoken" cookie lá, mas o dicionário évazio na solicitação AJAX. Pode ser o problema?
Desesperado para descobrir o que está realmente errado. Obrigado por ler isso.