Django开发服务器能正确提供SVG吗?

24 投票
3 回答
12066 浏览
提问于 2025-04-15 19:35

我正在尝试使用以下代码来提供一个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类型。

撰写回答