Django开发服务器能正确提供SVG吗?
我正在尝试使用以下代码来提供一个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>
在Firefox浏览器中,这会弹出一个插件提示。如果我把map.svg改名为map.xml,它就能正确显示图片。我猜这是因为Django的开发服务器(特别是django.views.static.serve)没有用正确的mime类型来提供svg文件。这是问题所在吗?如果是的话,有解决办法吗?
3 个回答
0
在我的情况下,问题出在使用nginx和gunicorn进行部署上。我的nginx Docker镜像把.svg文件的类型设置成了text/plain,也就是普通文本。这段mime.types的扩展解决了这个问题:
http {
include mime.types;
types {
image/svg+xml svg;
}
8
如果你是通过普通的 Django 视图动态提供 SVG 文件,你可以在返回的 HTTPResponse 对象中指定文件类型。在这种情况下,无论是在开发环境还是生产环境,你都需要设置正确的文件类型:
def myview(request):
svg_data = generate_some_svg_data()
return HttpResponse(svg_data, mimetype="image/svg+xml")
49
我现在没有Django可以测试这个,但看起来静态服务器使用的是 mimetypes库 来判断内容类型(具体来说是guess_type()这个函数)。
稍微查了一下,我发现了 一些代码,你可以把它放到你的settings.py里,以支持svg内容类型:
import mimetypes
mimetypes.add_type("image/svg+xml", ".svg", True)
mimetypes.add_type("image/svg+xml", ".svgz", True)
还有一篇 博客文章专门讲Pylons的,但提到了类似的问题。文章里说MIME类型存储在"/etc/mime.types"里,而SVG缺失是因为它不是一个官方的MIME类型。他可能是对的,因为我在 IANA 上找不到SVG的MIME类型。