Recibo un error de CSRF_Token faltante que solo ocurre en el modo de producción en mi servidor. Sin embargo, todo funciona muy bien cuando lo ejecuto desde la terminal de mi computadora usando el comando runserver. He leído muchas de las otras preguntas relacionadas con esto sin suerte. Parece que mi caso es un poco diferente a otros, ya que funciona localmente pero no en producción.
Recibo el error al enviar un formulario Ajax que se envía a "enviar" en views.py. ¿Alguien sabe qué podría estar causando esto? Además, al mirar mis cookies en el modo de producción, el CSRF_Token ni siquiera está allí para empezar. Localmente lo es. Gracias por cualquier ayuda.
Aquí está mi vista.py
from django.shortcuts import render from django.http import HttpResponse def index(request): return render(request, 'index.html') def submit(request): #Receive Request inputone = request.POST['randominfo'] inputtwo = request.POST['randominfo2'] #Some more code here that setups response. #Deleted since Im posting to StackOverflow return responseCódigo relacionado con el envío de Ajax
$(function () { $.ajaxSetup({ headers: { "X-CSRFToken": getCookie("csrftoken") } }); }); function getCookie(c_name) { if (document.cookie.length > 0) { c_start = document.cookie.indexOf(c_name + "="); if (c_start != -1) { c_start = c_start + c_name.length + 1; c_end = document.cookie.indexOf(";", c_start); if (c_end == -1) c_end = document.cookie.length; return unescape(document.cookie.substring(c_start,c_end)); } } return ""; } function submitAjax(event){ $.ajax({ type:'POST', url:'/submit/', data:{ randominfo:document.getElementById('Random').innerHTML, randominfo2:document.getElementById('Random2').innerHTML, }, dateType: 'json', success:function() { # Url here } }) };Solución que solucionó este problema.
Agregando "desde django.views.decorators.csrf importsure_csrf_cookie" en views.py y luego "@ensure_csrf_cookie" arriba de la vista que devuelve el archivo html que contenía el formulario ajax
El error ocurre porque no está configurando el token csrf, para evitar esto, debemos verificar algunos detalles
En primer lugar, debe configurar el token csrf en su formulario, en su html debe configurar algunos de la siguiente manera:
<form id="id" name="form"> {% csrf_token %} <!-- Form body here --> </form> En segundo lugar, el enfoque para configurar la cookie csrf en el encabezado de su solicitud está bien, solo sugiero que, en su lugar, configure su campo de datos uno por uno, use el método de serialize de jquery
data: $("#your-form-id").serialize()
Me gustaría recomendarle que lea esta publicación sobre la solicitud de ajax con django que es muy útil
Hay 2 cosas que puedes hacer:
1.) Envíe un token CSRF en su llamada ajax. Tienes que usar una función javascript getCookie() para obtenerlo. Afortunadamente, la documentación de django tiene un código que puedes copiar y pegar. javascript
$.ajax({ type:'POST', url:'/submit/', data:{ randominfo:document.getElementById('Random').innerHTML, randominfo2:document.getElementById('Random2').innerHTML, 'csrfmiddlewaretoken': getCookie('csrftoken'), // add this ...2.) Deshabilite csrf para su vista /submit. Puedes hacer esto con un decorador. Tenga en cuenta que esto es menos seguro, así que asegúrese de que no haya datos confidenciales.
vistas.py:
from django.views.decorators.csrf import csrf_exempt ... @csrf_exempt def your_submit_view(request): #view code