2011-10-04 38 views
8

Estoy tratando de hacer que ajax funcione, pero sigo recibiendo un error 403. Soy bastante nuevo en jquery.Django jquery ajax error 403

La siguiente es mi código

$('#prod_search_button').click(function(){ 
    if ($('#inv_prod_list').length) { 
     //insert a new record 
    } 
    else 
    { 
     //create the #inv_prod_list table and insert first record 
     var inv_table= '<table id="inv_prod_list" style="border: 2px solid #dddddd;"></table>'; 

     // create query object 
     var prod_query = { 
      query: jQuery.trim($('#id_prod_query').val()) 
     }; 

     // convert object to JSON data 
     var jsonQuery = JSON.stringify(prod_query); 

     $.ajax({ 
      type: 'POST', 
      url: '/company/product/item_search.json/', 
      data: jsonQuery, 

      success: function(jsonData){ 
        var parsed = JSON.parse(jsonData); 
        $('#inv_prod_wrap').html(inv_table); 

        var new_record = 'this is html for new row' 

        $('#inv_prod_list tr:last').after(new_record); 



        //off rows alt color 
        } 
     }); 
    } 
}); 
+0

Uso Firebug (una extensión de Firefox) (u otra consola de Javascript) para ver cuál es la razón detrás de la 403 es . Verá la página de error de Django (con la sugerencia útil sobre el token CSRF). – LaundroMat

+0

http://stackoverflow.com/a/30210391/940098 – Wtower

Respuesta

20
+1

sí, ese es exactamente el problema, ¡gracias! Todo lo que tenía que hacer era copiar ese fragmento de código de los documentos oficiales en un archivo js e incluirlo en mi html. –

0

Ver the HTTP/1.1 Status Code Definitions. "403" es el código de estado "Prohibido". Este es un error que se produce en el lado del servidor de su solicitud $.ajax, no del lado del cliente (es decir, su código está realizando una solicitud, pero la respuesta del servidor es un mensaje de error).

El documento indica que los servidores deben responder con ese error sólo en situaciones específicas:

El servidor ha entendido la solicitud, pero se niega a cumplirlo. La autorización no ayudará y la solicitud NO DEBE repetirse. Si el método de solicitud no era HEAD y el servidor desea hacer público el motivo por el cual no se ha cumplido la solicitud, DEBERÍA describir el motivo de la negativa en la entidad. Si el servidor no desea poner esta información a disposición del cliente, se puede usar el código de estado 404 (No encontrado).

Normalmente, un error de este tipo significa que cualquiera que sea el usuario que haya iniciado sesión no tiene acceso a la URL que está solicitando. A menudo, esto indica que el único error en su código es la URL a la que hace la solicitud o el orden de una secuencia de llamadas (por ejemplo, está tratando de solicitar datos antes de iniciar sesión). Con menos frecuencia, algunos servidores web y aplicaciones web están configurados para responder con 403 códigos de error en lugar de códigos de error 404 (no encontrados) para todas las solicitudes "inválidas" para evitar la filtración de información sobre qué archivos existen o no en el servidor.

+0

ese no es el problema. Intenté eliminar todos los requisitos de validación del usuario y todavía arroja el mismo error. –

0

Me encontré con esto y pensé en publicar lo que estaba pasando. Tenía el {% CSRF_TOKEN %} en un caché paginado y estaba almacenando en caché lo que puso ahí. ¡Entonces para algunos usuarios era válido y algo no dependía del caché! Fue una pesadilla localizarlo aunque debería haber sido obvio ... Así que revisa tu almacenamiento en caché.

1

Puede evitar el CSRF agregando la siguiente anotación antes de la definición de su método.

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def Method(): 
0

También se puede verificar si csrf middleware está habilitado en settings.py y deshabilitarlo. Busque 'django.middleware.csrf.CsrfViewMiddleware'.

1

simplemente copiar ese trozo de código de the official docs en un archivo js e incluirla en su html

// using jQuery 
function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie !== '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) === (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 
var csrftoken = getCookie('csrftoken'); 
function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 
$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
});