2011-03-23 28 views
9

¿Cómo puedo usar el método jquery.post() en Django?

Esto es lo que estoy tratando de hacer:

  var postdata={ 
       'username':$('#login-email').val(), 
       'password':$('#login-password').val() 
     } 

     $.post('/login/',postdata) 

¿Cómo proteger csrf esto en Django? ¿Hay alguna forma de agregar al token CSRF a los datos de la publicación?

+0

Creo que realmente significa para preguntar "¿Cómo envío AJAX solicitudes en Python", a la derecha ? No hay un método "jquery.Post()" en ningún otro idioma o marco que no sea jquery. Estás pidiendo la operación equivalente, ¿correcto? –

+2

@Mike Creo que está preguntando cómo usar jQuery para enviar datos * a * Django, voy a editar el título (de nuevo) para hacerlo más claro –

Respuesta

8

por lo general se refieren un archivo con a cada página que quiero ser capaz de hacer peticiones Ajax este contenido:

if (!$) 
    var $ = django.jQuery; 

$('html').ajaxSend(function(event, xhr, settings) { 
    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 = $.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; 
    } 
    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
     // Only send the token to relative URLs i.e. locally. 
     xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
    } 
}); 
0

El módulo contrib en Django has a CSRF module que puede usar.

En cuanto a su pregunta sobre cómo enviar un POST, siempre que tenga la URL asignada correctamente se le enviarán las solicitudes. Puede manejar una solicitud POST específicamente marcando request.POST en el objeto de solicitud.

+0

Específicamente estaba hablando sobre el método $ .post. La razón por la que hice esta pregunta es porque no quería tener que lidiar con un guión tan engorroso. – ocoutts

33

Sí. Creo que está almacenado en {{ csrf_token }}. Entonces, solo haga

 var postdata={ 
      'username':$('#login-email').val(), 
      'password':$('#login-password').val(), 
      'csrfmiddlewaretoken': '{{ csrf_token }}' 
    } 

Es posible que tenga que verificar los nombres, pero eso debería ser correcto.

+4

Es en realidad '{% csrf_token%}' de lo contrario, esta es de lejos la mejor solución. – HurnsMobile

+0

@Hurns: gracias. Fijo. – mpen

+2

Whoops Quise decir '{{csrf_token}}' ¡la otra variación es la variante de campo de formulario oculto! perdón por confundir el tema :) – HurnsMobile

5

Aunque no proporcionó su html en su ejemplo ¿es seguro asumir que está utilizando un <form>? Si es así, agregue su etiqueta de plantilla de token CSRF a su formulario y llame al .serialize() en su formulario.