2009-10-14 11 views
5

¿Cuál es la convención común para admitir la representación múltiple (por ejemplo, html, json, xml) de los recursos (por ejemplo, blog, usuario) en django?Content-Type and Representations

Primero, no sé cómo debo formatear mis URL. Por ejemplo, cuál es su opinión sobre el uso de cualquiera de estas direcciones URL para solicitar formato XML

  • /<resource>.<format>, por ejemplo, /blogs/123.xml
  • /<format>/<resource>, p. Ej. /xml/blogs/123
  • /<resource>?format=<format>, p. /blogs/123?format=xml

¿Debo simplemente confiar en el parámetro pasado Content-Type? ¿Qué hay de tener una representación móvil múltiple (por ejemplo, iphone, móvil, palm) y una representación completa del navegador?

¿Qué pasa con las vistas? ¿Cuál es la convención para elegir las plantillas correctas sin tener muchas declaraciones if o mucho código duplicado?

Respuesta

7

lo que podría hacer, si esto llegara a funcionar, es:

  • Sus puntos de vista se ven para la cabecera Accept (creo que eso es lo que estaba hablando) y decidir qué tipo de contenido a enviar de vuelta basado en el encabezado Accept.
  • Tiene un middleware que busca una extensión en Request-URI, la elimina y agrega el tipo de contenido asociado al encabezado Accept de la solicitud.

Para esta solución, los tipos de contenido en la URL siempre se representarían como una extensión de archivo asociada, ni como parte de la cadena de consulta ni como parte del nombre del recurso. Pero aparte de las solicitudes generadas por el navegador, los tipos de contenido deberían entrar en a través del encabezado Accept.

Así que la petición llega como:

GET /blogs/123.xml HTTP/1.1 
Host: example.com 

El middleware que transforma a:

GET /blogs/123 HTTP/1.1 
Host: example.com 
Accept: application/xml 

Su punto de vista ve application/xml y devuelve una respuesta con contenido XML.

+0

Esta es una buena idea. –

+0

Limpio (y +1) - ¿pero podría proporcionar algún código de vista de muestra? ¿Este riesgo no ensucia el código de vista con muchos modificadores según el tipo de contenido? No puedo pensar inmediatamente en una forma elegante de hacerlo, pero me gustaría ver si alguien más puede hacerlo. –