【问题标题】:Can the Django dev server correctly serve SVG?Django 开发服务器可以正确地为 SVG 服务吗?
【发布时间】:2011-01-19 17:47:29
【问题描述】:

我正在尝试使用以下方式提供 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)没有为 svg 提供正确的 mime 类型。是不是这个问题,如果有,有补丁吗?

【问题讨论】:

    标签: python django svg


    【解决方案1】:

    我目前没有可用的 Django 来测试它,但看起来静态服务器使用 mimetypes library 来确定内容类型(特别是 guess_type())。

    通过谷歌搜索,我发现了some code,您可能可以在 settings.py 中添加对 svg 内容类型的支持:

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

    还有一个特定于 Pylons 的 blog post,但它提到了一个类似的问题。他指定 MIME 类型存储在“/etc/mime.types”中,并且缺少 SVG,因为它不是官方的 MIME 类型。他可能是对的,因为我在 IANA 的任何地方都找不到 SVG 的 MIME 类型。

    【讨论】:

    • 成功了。希望这些被添加到 mimetypes 库中。
    • 赞成解决一个奇怪的问题。我有这个问题一个多星期了,django staticfiles 似乎在开发服务器中提供了虚假的 mimetypes,比如'image/x-png'。添加与上面类似的行解决了这个问题: mimetypes.add_type("image/png", ".png", True)
    • 我不太清楚为什么,但我刚刚使用generator-wagtail 安装了wagtail,并且管理面板中没有显示svg 徽标。 &lt;img src="/static/wagtailadmin/images/wagtail-logo.svg" alt="Wagtail" width="80"&gt;。我尝试了上述技巧,但调用 svg url 似乎没有应用 image/svg+xml mimetype。我还没有使用像 nginx 这样的服务器提供静态文件,目前使用'django.contrib.staticfiles',。有什么想法吗?
    • 太棒了!在我的开发环境中为我省去了很多烦恼!
    【解决方案2】:

    如果您从常规 django 视图动态提供 SVG,则可以在从该视图返回的 HTTPResponse 对象中指定 mimetype。在这种情况下,您需要将 mimetype 用于开发和生产用途:

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

    【讨论】:

    • 不,svg 是静态的。所以我希望 Django 静态服务会处理它。
    • static.serve 使用 python 的内置 mimetypes 模块(正如 Lance McNearney 在他的帖子中提到的那样)根据文件名猜测 mimetype ......在我的情况下,它似乎猜对了(@987654324 @. 你能用 firebug 验证这是与 map.svg 文件一起发送的 mimetype 吗?
    • 我在 Windows 上使用 Python 2.6 得到 (None, None)。
    • 有趣!很高兴知道。在 OS X 和 ubuntu 上,我得到了开箱即用的 'image/svg+xml'。深入研究 mimetypes.py 的 python 源代码,我发现它有一个不包括 svg 的默认类型列表,并且它具有指向类 unix 系统的其他类型列表帮助器的路径。我从来不知道...谢谢你的问题。
    • 另外,如果你是动态做的,mimetype 似乎不存在(至少在 Django 1.7 上),所以我改用了content_type="image/svg+xml"
    【解决方案3】:

    在我的例子中,发行者是使用 nginx+gunicorn 的部署。我的 nginx 泊坞窗图像为 .svg 文件提供文本/纯 mimetype。这个 mime.types 扩展解决了这个问题:

    http {
        include mime.types;
        types {
            image/svg+xml svg;
        }
    

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2022-01-05
      • 2015-07-06
      • 2018-04-04
      • 2011-01-22
      • 1970-01-01
      相关资源
      最近更新 更多