2010-02-22 3 views
18

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

ответ

42

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

С немного Googling, я наткнулся на some code, что вы могли бы, вероятно, бросить в вашем settings.py, чтобы добавить поддержку для типа контента: SVG

import mimetypes 

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

Там же этот blog post конкретные Пилоны, но это упоминает подобную проблему. Он указывает, что типы MIME хранятся в «/etc/mime.types» и что SVG отсутствует, поскольку он не является официальным типом MIME. Он может быть прав, поскольку я не могу найти MIME-тип для SVG в любом месте на IANA.

+0

Это сделал трюк. Надеемся, что они будут добавлены в mimetypes lib. –

+5

Upvote для решения странной проблемы. У меня была эта проблема более недели, django staticfiles, похоже, служит faux mimetypes в devserver, например, «image/x-png». Добавление подобной строки, как описано выше, разрешило: mimetypes.add_type («image/png», «.png», True) – David

+0

Я не совсем понимаю, почему, но я только что установил [трясогуз] (http://wagtail.io /) с использованием [generator-wagtail] (https://www.npmjs.org/package/generator-wagtail) и svg logo в панели администратора не отображается. 'Wagtail'. Я попробовал вышеупомянутый трюк, но при вызове svg url не применяется mimetype 'image/svg + xml'. Я не обслуживаю статические файлы с сервером, например nginx, в настоящее время использующим '' django.contrib.staticfiles ', '. Есть идеи? – GabLeRoux

6

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

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

Нет svg является статическим. Поэтому я надеялся, что старая служба Django позаботится об этом. –

+1

'static.serve' использует встроенный модуль mimetypes python (как упоминает Лэнс Макнейрни в своем посте), чтобы угадать тип mimetype на основе имени файла ... в моем случае он, кажется, правильно угадывает (' import mimetypes; print mimetypes. guess_type ('map.svg') '. Можете ли вы проверить с помощью firebug, что это mimetype, отправляемый с файлом map.svg? –

+1

Я получаю (None, None) с Python 2.6 в Windows. –