django - tutorial - ¿Determinar el tipo de contenido solicitado?
framework django python (4)
Como se dijo en otras respuestas, esta información se encuentra en el encabezado de solicitud Accept
. Disponible en la solicitud como HttpRequest.META[''HTTP_ACCEPT'']
.
Sin embargo, no hay un solo tipo de contenido solicitado, y este encabezado a menudo es una lista de tipos de contenido aceptados / preferidos. Esta lista puede ser un poco molesta de explotar adecuadamente. Aquí hay una función que hace el trabajo:
import re
def get_accepted_content_types(request):
def qualify(x):
parts = x.split('';'', 1)
if len(parts) == 2:
match = re.match(r''(^|;)q=(0(/./d{,3})?|1(/.0{,3})?)(;|$)'',
parts[1])
if match:
return parts[0], float(match.group(2))
return parts[0], 1
raw_content_types = request.META.get(''HTTP_ACCEPT'', ''*/*'').split('','')
qualified_content_types = map(qualify, raw_content_types)
return (x[0] for x in sorted(qualified_content_types,
key=lambda x: x[1], reverse=True))
Por ejemplo, si request.META[''HTTP_ACCEPT'']
es igual a "text/html;q=0.9,application/xhtml+xml,application/xml;q=0.8,*/*;q=0.7"
. Esto devolverá: [''application/xhtml+xml'', ''text/html'', ''application/xml'', ''*/*'']
(no en realidad, ya que devuelve un generador) .
Luego, puede recorrer la lista resultante para seleccionar el primer tipo de contenido que sabe cómo responder correctamente.
Tenga en cuenta que esta función debería funcionar en la mayoría de los casos, pero no manejar casos como q=0
que significa "No aceptable".
Fuentes: especificación de cabecera de aceptación HTTP y especificación de valores de calidad
Me gustaría escribir una vista Django que sirva contenido variante basado en lo que se solicita. Por ejemplo, para "texto / xml", sirva XML, para "texto / json", sirva JSON, etc. ¿Hay alguna forma de determinar esto a partir de un objeto de solicitud? Algo como esto sería increíble:
def process(request):
if request.type == "text/xml":
pass
elif request.type == "text/json":
pass
else:
pass
¿Hay una propiedad en HttpRequest
para esto?
El encabezado ''Content-Type'' indica el tipo de medio enviado en la solicitud HTTP. Esto se utiliza para solicitudes que tienen un contenido (POST, PUT).
"Tipo de contenido" no debe utilizarse para indicar el formato de respuesta preferido, el encabezado "Aceptar" sirve para este propósito. Para acceder a él en Django use: HttpRequest.META.get (''HTTP_ACCEPT'')
en django 1.10, ahora puede usar request.content_type
, como se menciona aquí en su documento
HttpRequest.META
, más específicamente HttpRequest.META.get(''HTTP_ACCEPT'')
- y no como se mencionó anteriormente HttpRequest.META.get(''CONTENT_TYPE'')