python - csrfmiddlewaretoken - get csrf token django
La cookie Django CSRF no está configurada (16)
Tengo un problema desde hace un tiempo, estoy experimentando que las cookies de CSRF no estén configuradas. Por favor mira los códigos a continuación
Pitón
def deposit(request,account_num):
if request.method == ''POST'':
account = get_object_or_404(account_info,acct_number=account_num)
form_=AccountForm(request.POST or None, instance=account)
form = BalanceForm(request.POST)
info = str(account_info.objects.filter(acct_number=account_num))
inf=info.split()
if form.is_valid():
#cd=form.cleaned_data
now = datetime.datetime.now()
cmodel = form.save()
cmodel.acct_number=account_num
#RepresentsInt(cmodel.acct_number)
cmodel.bal_change="%0.2f" % float(cmodel.bal_change)
cmodel.total_balance="%0.2f" %(float(inf[1]) + float(cmodel.bal_change))
account.balance="%0.2f" % float(cmodel.total_balance)
cmodel.total_balance="%0.2f" % float(cmodel.total_balance)
#cmodel.bal_change=cmodel.bal_change
cmodel.issued=now.strftime("%m/%d/%y %I:%M:%S %p")
account.recent_change=cmodel.issued
cmodel.save()
account.save()
return HttpResponseRedirect("/history/" + account_num + "/")
else:
return render_to_response(''history.html'',
{''account_form'': form},
context_instance=RequestContext(request))
En el HTML aquí está el código
HTML
<form action="/deposit/{{ account_num }}/" method="post">
<table>
<tr>
{{ account_form.bal_change }}
<input type="submit" value="Deposit" />
</tr>
{% csrf_token %}
</table>
</form>
Estoy atascado, ya limpié la cookie, usé otro navegador pero todavía no se configuró la cookie csrf.
Al borrar el caché de mi navegador solucioné este problema por mí. He estado cambiando entre entornos de desarrollo local para hacer el tutorial django-blog-zinnia después de trabajar en otro proyecto cuando sucedió. Al principio, pensé que cambiar el orden de INSTALLED_APPS para que coincidiera con el tutorial lo había provocado, pero lo configuré y no pude corregirlo hasta que se borró el caché.
Asegúrate de que tu backend de sesión de django esté configurado correctamente en settings.py. Entonces prueba esto,
class CustomMiddleware(object): def process_request(self,request:HttpRequest): get_token(request)
Agregue este middleware en settings.py
bajo MIDDLEWARE_CLASSES o MIDDLEWARE dependiendo de la versión de django
get_token - Devuelve el token CSRF requerido para un formulario POST. La ficha es un valor alfanumérico. Se crea un nuevo token si uno no está ya configurado.
De This puedes resolverlo agregando el decorador ensure_csrf_cookie a tu vista
from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
#...
si este método no funciona Intentarás comentar csrf en middleware. y prueba de nuevo.
El problema parece ser que no está manejando las solicitudes GET
apropiada o publicando los datos directamente sin obtener primero el formulario.
Cuando accede por primera vez a la página, el cliente enviará la solicitud GET
, en ese caso debe enviar html con el formulario apropiado.
Más tarde, el usuario rellena el formulario y envía la solicitud POST
con los datos del formulario.
Tu vista debería ser:
def deposit(request,account_num):
if request.method == ''POST'':
form_=AccountForm(request.POST or None, instance=account)
if form.is_valid():
#handle form data
return HttpResponseRedirect("/history/" + account_num + "/")
else:
#handle when form not valid
else:
#handle when request is GET (or not POST)
form_=AccountForm(instance=account)
return render_to_response(''history.html'',
{''account_form'': form},
context_instance=RequestContext(request))
En su opinión, ¿está usando el decorador csrf?
from django.views.decorators.csrf import csrf_protect
@csrf_protect def view(request, params): ....
Encontré una situación similar mientras trabajaba con DRF, la solución fue agregar el método .as_view () a la Vista en urls.py
Estaba usando Django 1.10 antes. Así que estaba enfrentando este problema. Ahora lo he degradado a Django 1.9 y está funcionando bien.
Este problema surgió de nuevo recientemente debido a un error en Python.
http://bugs.python.org/issue22931
https://code.djangoproject.com/ticket/24280
Entre las versiones afectadas se encontraban 2.7.8 y 2.7.9. La cookie no se leyó correctamente si uno de los valores contenía un [
carácter.
La actualización de Python (2.7.10) corrige el problema.
Esto también puede ocurrir si se establece CSRF_COOKIE_SECURE = True
y está accediendo al sitio de forma no segura.
Método 1:
from django.shortcuts import render_to_response
return render_to_response(
''history.html'',
RequestContext(request, {
''account_form'': form,
})
Método 2:
from django.shortcuts import render
return render(request, ''history.html'', {
''account_form'': form,
})
Porque el método render_to_response puede presentar algún problema de cookies de respuesta.
Me acabo de encontrar una vez, la solución es vaciar las cookies. Y puede modificarse al depurar SECRET_KEY relacionado.
Si usa la API de recuperación de HTML5 para realizar solicitudes POST como usuario conectado y se lo Forbidden (CSRF cookie not set.)
, podría ser porque, de manera predeterminada, fetch
no incluye cookies de sesión, lo que hace que Django piense que usted es usuario diferente al que cargó la página.
Puede incluir el token de sesión pasando las credentials: ''include''
la opción credentials: ''include''
para recuperar:
var csrftoken = getCookie(''csrftoken'');
var headers = new Headers();
headers.append(''X-CSRFToken'', csrftoken);
fetch(''/api/upload'', {
method: ''POST'',
body: payload,
headers: headers,
credentials: ''include''
})
Tuve el mismo error, en mi caso agregar method_decorator me ayuda a:
from django.views.decorators.csrf import csrf_protect
from django.utils.decorators import method_decorator
method_decorator(csrf_protect)
def post(self, request):
...
Verifique que las cookies de Chrome estén configuradas con la opción predeterminada para sitios web. Permitir que los datos locales que se establezcan (recomendado).
intenta verificar si tienes instalado en settings.py
MIDDLEWARE_CLASSES = (
''django.middleware.common.CommonMiddleware'',
''django.contrib.sessions.middleware.SessionMiddleware'',
''django.middleware.csrf.CsrfViewMiddleware'',)
En la plantilla, los datos están formateados con csrf_token:
<form>{% csrf_token %}
</form>
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def your_view(request):
if request.method == "POST":
# do something
return HttpResponse("Your response")