Может ли 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;
}