disable csrfmiddlewaretoken csrf_token python django

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 }} &nbsp; <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.



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")