Может ли Django dev сервер правильно обслуживать 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 это приводит к приглашению плагина. Если я переименую карту. svg для сопоставления. xml показывает изображение правильно. Я предполагаю, что это связано с тем, что сервер Django dev (в частности django.views.static.serve) не обслуживает svg с правильным типом mime. Это проблема, и если да, есть ли патч?

Ответы

Ответ 1

У меня нет Django для тестирования на данный момент, но похоже, что статический сервер использует mimetypes library для определения содержимого тип (в частности, guess_type()).

С чуть-чуть Googling я наткнулся на некоторый код, который вы, вероятно, могли бы добавить в свои 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. Он может быть прав, поскольку я не могу найти MIME-тип для SVG в любом месте IANA.

Ответ 2

Если вы обслуживаете SVG динамически из обычного представления django, вы можете указать тип mimetype в объекте HTTPResponse, который вы возвращаете из это представление. В этом случае вам понадобится mimetype для использования как dev, так и производства:

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

Ответ 3

В моем случае эмитентом было развертывание с nginx + gunicorn. Мое изображение nginx docker служило text/plain mimetype для файла.svg. Это расширение mime.types решило проблему:

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