2012-08-01 436 views
8

Así que estoy tratando básicamente de configurar una página web donde un usuario elige una identificación, la página web luego envía la información de identificación a python, donde python usa la identificación para consultar una base de datos, y luego devuelve el resultado a la página web para su visualización.Pasar información de javascript a la aplicación django y volver

No estoy muy seguro de cómo hacerlo. Sé cómo usar una llamada ajax para llamar a los datos generados por python, pero no estoy seguro de cómo comunicar la información de identificación inicial a la aplicación django. ¿Es posible decir, consultar una url como ./app/id (IE/app/8) y luego usar la información de la url para darle a python la información? ¿Cómo voy a editar urls.py y views.py para hacer eso?

Gracias,

+0

Esto es solo código de vista/url Django estándar. Las solicitudes de Ajax no son diferentes de las solicitudes normales en este contexto. –

+1

A pesar de (y precisamente por eso) ser una pregunta básica sobre AJAX y Django, esta pregunta me ha resultado muy útil. Este tipo de preguntas sobre "cómo comenzar" son difíciles de encontrar (incluso en los tutoriales básicos de lectura y escritura) en StackOverflow y pueden ahorrar un montón de esfuerzo para los novatos. Gracias xhassassin! – viridis

Respuesta

27

Estamos hablando de AJAX. AJAX siempre requiere 3 piezas (técnicamente, solo dos: Javascript hace doble servicio).

  1. cliente (Javascript en este caso) hace petición
  2. Server (vista de Django en este caso) se encarga de la solicitud y devuelve respuesta
  3. cliente (de nuevo, Javascript) recibe la respuesta y hace algo con él

No ha especificado un marco de trabajo preferido, pero sería una locura para hacer AJAX sin un marco de Javascript de algún tipo, por lo que voy a elegir jQuery para usted. El código muy fácilmente se puede adaptar a cualquier marco de Javascript:

$.getJSON('/url/to/ajax/view/', {foo: 'bar'}, function(data, jqXHR){ 
    // do something with response 
}); 

estoy usando $.getJSON, que es un método de conveniencia jQuery que envía una solicitud GET a una URL y automáticamente analiza la respuesta JSON, convirtiéndola en un objeto JavaScript pasado como data aquí. El primer parámetro es la URL a la que se enviará la solicitud (más sobre eso en un bit), el segundo parámetro es un objeto Javascript que contiene datos que deben enviarse junto con la solicitud (puede omitirse si no necesita enviar cualquier dato), y el tercer parámetro es una función de devolución de llamada para manejar la respuesta del servidor en caso de éxito. Entonces, este simple código cubre las partes 1 y 3 mencionadas anteriormente.

La siguiente parte es su controlador, que por supuesto en este caso será una vista de Django.El único requisito para la vista es que debe devolver una respuesta JSON:

from django.utils import simplejson 

def my_ajax_view(request): 
    # do something 
    return HttpResponse(simplejson.dumps(some_data), mimetype='application/json') 

Tenga en cuenta que este punto de vista no tiene ningún argumento que no sea el request requerido. Esta es una elección filosófica. En mi humilde opinión, en una verdadera forma de REST, los datos deben pasarse con la solicitud, no en la URL, pero otros pueden y no están de acuerdo. La mejor elección depende de usted.

Además, tenga en cuenta que aquí he usado la biblioteca de Django's simplejson que es óptima para las estructuras de datos comunes de Python (listas, dicts, etc.). Si desea devolver una instancia de modelo de Django o un conjunto de consulta, debe usar la biblioteca de serializadores en su lugar.

from django.core import serializers 
... 
data = serializers.serialize('json', some_instance_or_queryset) 
return HttpResponse(data, mimetype='application/json') 

Ahora que tiene un punto de vista, todo lo que tiene que hacer es alambre para arriba en urlpatterns de Django Django así sabrá cómo encaminar la solicitud.

urlpatterns += patterns('', 
    (r'^/url/to/ajax/view/$', 'myapp.views.my_ajax_view'), 
) 

Aquí es donde esa diferencia filosófica viene en Si decide pasar los datos a través de la URL en sí, tendrá que capturarlo en el URLPATTERN:.

(r'^/url/to/ajax/view/(?P<some_data>[\w-]+)/$, 'myapp.views.my_ajax_view'), 

A continuación, modificar su punto de vista a aceptarlo como un argumento:

def my_ajax_view(request, some_data): 

Y, por último, modificar el método de Javascript AJAX para incluirlo en la URL:

$.getJSON('/url/to/ajax/view/'+some_data+'/', function(data, jqXHR){ 

Si vas a la ruta de transmitir los datos de la solicitud, entonces usted necesita para cuidar es posible recuperar correctamente en la vista:

def my_ajax_view(request): 
    some_data = request.GET.get('some_data') 
    if some_data is None: 
     return HttpResponseBadRequest() 

que debe darle suficiente para asumir casi cualquier Funcionalidad AJAX con Django. Todo lo demás se trata de cómo su vista recupera los datos (los crea manualmente, consulta la base de datos, etc.) y cómo su método de devolución de llamada de Javascript maneja la respuesta JSON. Algunos consejos sobre que:

  1. El objeto data se general ser una lista, incluso si sólo se incluye un artículo. Si sabes que solo hay un artículo, puedes usar data[0]. De lo contrario, utilice un bucle for para acceder a cada elemento:

    form (var i=0; i<data.length; i++) { 
        // do something with data[i] 
    } 
    
  2. Si data o data[i] es un objeto (También conocido como diccionario, hachís, tecleados matriz, etc.), se puede acceder a los valores de las claves mediante el tratamiento las teclas como atributos, es decir:

    data[i].some_key 
    
  3. Cuando se trata de respuestas JSON y AJAX en general, por lo general es mejor probarlo directamente en un navegador primero para que pueda ver la respuesta exacta y/o verificar la estructura de la respuesta. Para ver las respuestas JSON en su navegador, lo más probable es que necesite una excepción. JSONView (disponible tanto para Firefox como para Chrome) le permitirá comprender JSON y mostrarlo como una página web. Si la solicitud es un GET, puede pasar datos a la URL en la moda GET normal utilizando una cadena de consulta, es decir, http://mydomain.com/url/to/ajax/view/?some_data=foo. Si se trata de un POST, necesitará algún tipo de cliente de prueba REST. RESTClient es un buen complemento para Firefox. Para Chrome puedes probar Postman.También son excelentes para aprender API de terceros de Twitter, Facebook, etc.

+1

Respuesta muy detallada Chris. ¡Bien hecho! – Jens

+2

¡Buena respuesta! Pero cuidado, django.utils.simplejson está en desuso en Django 1.5+ como se indica en [notas de la versión de Django 1.5] (https://docs.djangoproject.com/en/1.5/releases/1.5-alpha-1/#system- version-of-simplejson-no-longer-used) – viridis

+0

https://docs.djangoproject.com/en/1.10/releases/1.5/#system-version-of-simplejson-no-longer-used – joshlsullivan

1

Sí, es posible. Si pasa la identificación como parámetro a la vista que usará dentro de su aplicación, como: def example_view (request,id) y en urls.py, puede usar algo como esto: url(r'^example_view/(?P<id>\d+)/', 'App.views.example_view').

La identificación en la url /example_view_template/8 tendrá acceso al resultado usando la identificación que está relacionada con el número 8. Como el 8vo registro de una tabla específica en su base de datos, por ejemplo.

+0

Jaja, gracias. Sí, lo de "P" es todo lo que necesitaba, lo encontré en el tutorial de django unos minutos después de haber preguntado aquí. – xhassassin

0

Acerca de cómo capturar información de ajax request/urls, por lo general, puede hacerlo como en las solicitudes de django normales, marque url dispatcher docs y lea acerca de las vistas de django desde los documentos oficiales.

Acerca de cómo devolver la respuesta, simplemente capture los parámetros, procese su solicitud y luego responda con la mímica adecuada.

A veces hay que serialize o convertir sus datos a otro formato como JSON que se puede procesar de manera más eficiente en un lado del cliente/js

Cuestiones relacionadas