2010-02-22 19 views
18

estoy tratando de servir a un mapa SVG usando:¿Puede el servidor Django Dev servir correctamente SVG?

<object data="map.svg" type="image/svg+xml" width="400" height="300"> 
    <embed src="map.svg" type="image/svg+xml" width="400" height="300" /> 
</object> 

En Firefox esto conduce a un símbolo del plugin. Si cambio el nombre del mapa svg al mapa. xml muestra la imagen correctamente. Supongo que esto se debe a que el servidor de desarrollo de Django (específicamente django.views.static.serve) no está sirviendo el svg con el tipo de mime correcto. ¿Es este el problema y, de ser así, hay un parche?

Respuesta

42

que no tienen Django disponibles para probar esto en el momento, pero parece que el servidor utiliza la estática a mimetypes library determinar el tipo de contenido (específicamente guess_type()).

Con un poco de una búsqueda en Google, me encontré con some code que probablemente podría lanzar en su settings.py para añadir soporte para el tipo de contenido SVG:

import mimetypes 

mimetypes.add_type("image/svg+xml", ".svg", True) 
mimetypes.add_type("image/svg+xml", ".svgz", True) 

Hay también esta blog post específica a los pilones pero menciona un problema similar. Especifica que los tipos MIME se almacenan en "/etc/mime.types" y que SVG falta porque no es un tipo MIME oficial. Él puede estar en lo cierto, ya que no puedo encontrar un tipo MIME para SVG en cualquier lugar en el IANA.

+0

Eso hizo el truco. Con suerte, esos se agregan a mimetypes lib. –

+5

Voto a favor de resolver un problema extraño. Tuve este problema por más de una semana, django staticfiles parece servir falsos mimetypes en el devserver, como 'image/x-png'. Agregar una línea similar a la anterior resolvió eso: mimetypes.add_type ("image/png", ".png", True) – David

+0

No estoy muy seguro de por qué, pero acabo de instalar [wagtail] (http://wagtail.io /) utilizando [generador-wagtail] (https://www.npmjs.org/package/generator-wagtail) y el logotipo svg en el panel de administración no se muestra. 'Wagtail'. Probé el truco anterior, pero llamar a svg url no parece tener aplicado el tipo mimet 'image/svg + xml'. No estoy sirviendo archivos estáticos con un servidor como nginx todavía, actualmente usando ''django.contrib.staticfiles ','. ¿Alguna idea? – GabLeRoux

6

Si está sirviendo el SVG dinámicamente desde una vista de django normal, puede especificar el tipo MIME en el objeto HTTPResponse que devuelve desde esa vista. En este caso, tendrá que las mimetype en lugar tanto para la producción dev y su uso:

def myview(request): 
    svg_data = generate_some_svg_data() 
    return HttpResponse(svg_data, mimetype="image/svg+xml") 
+0

No el svg es estático. Así que esperaba que el servicio estático de Django lo solucionara. –

+1

'static.serve' usa el módulo mimetypes incorporado de python (como menciona Lance McNearney en su publicación) para adivinar el tipo mimet basado en el nombre de archivo ... en mi caso, parece adivinar correctamente (' importar tipos de mimeet; imprimir tipos de mimet. guess_type ('map.svg') '. ¿Puedes verificar usando firebug que este es el tipo mimet que se envía con el archivo map.svg? –

+1

Obtengo (None, None) con Python 2.6 en Windows. –

Cuestiones relacionadas