2010-09-11 11 views
5

Estoy usando Google App Engine, Jquery y Django. Quiero datos POST a ser enviadas al servidor cuando se envía un formulario, y hacer esto en jQuery con el siguiente código:jQuery La solicitud AJAX se llama dos veces al usar Jquery, Django y Google App Engine

$("#listform").submit(function() { 
      $.ajax({ 
        type: "POST", 
        url: "/xhrtest", 
        data: {'name': 'herman'}, 
        success: function(data){ 
          console.log(data) 
        } 
      }); 
    }) 

En mi opinión Django:

def xhrtest(request): 
     if request.method == "POST": 
       return HttpResponse("Post data!") 
     else: 
       return HttpResponse("GET request.") 

Tendría espera recibir una respuesta de "¡Datos de publicación!", pero de alguna manera la respuesta es siempre "Solicitud GET". Esto tampoco es un problema unicode, ya que uno puede imprimir el método request.method y ver "GET".

Al evaluar esto en Firebug, veo dos solicitudes en curso: Primero una solicitud POST, que recibe la respuesta "GET request". y luego una solicitud GET, que recibe la respuesta "Obtener solicitud". también. En la consola de desarrollo de Google App Engine también puedo ver dos solicitudes en proceso. La solicitud POST se cumple con una respuesta 301 y el GET con 200.

¿Qué significa esto y qué debo hacer para recibir datos POST?

+0

¿Está request.method (en su código django) en el caso correcto? Si es "publicación", no será igual a "POST". – kevingessner

+0

Algunas configuraciones de servidor están redireccionando sus solicitudes POST, parece. (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) – mkoistinen

Respuesta

11

El problema es casi seguro que está solicitando la url /xhrtest, sin una barra final. De forma predeterminada, Django redireccionará esa solicitud al /xhrtest/ - con una barra diagonal final - y esa redirección será un GET, no un POST.

Para obtener más información, consulte la configuración APPEND_SLASH que configura este comportamiento y el módulo CommonMiddleware que lo utiliza.

+0

Gracias, eso lo resolvió. No sabía que django tuviera ese comportamiento predeterminado. –