не могу понять, служат ли статические изображения в среде разработчиков django - PullRequest
2 голосов
/ 16 марта 2010

Я прочитал статью (и несколько других на эту тему), но все еще не могу понять, как показать изображение, если не сложна ссылка на файл, существующий в веб-сервисе. в HTML-шаблон.

Я попал в urls.py :

...        
(r'^galleries/(landscapes)/(?P<path>.jpg)$', 
    'django.views.static.serve', {'document_root': settings.MEDIA_URL}),

...

где «пейзажи» - один из альбомов, с которых я пытаюсь показать изображения. (Есть еще несколько из них.)

В views.py он вызывает шаблон с таким кодом:

...
<li><img src=160.jpg alt='' title='' /></li>
...

, которая преобразует ссылку на изображение в html в:

http://127.0.0.1:8000/galleries/landscapes/160.jpg

В settings.py У меня есть:

MEDIA_ROOT = 'C:/siteURL/galleries/'
MEDIA_URL = 'http://some-good-URL/galleries/'

В файловой системе есть файл C: /siteURL/galleries/landscapes/160.jpg, и у меня есть тот же файл в http://some -good-URL / galleries / landscapes / 160.jpg

Независимо от того, что я использую в urls.py - MEDIA_ROOT или MEDIA_URL (с ожиданием подачи либо локальных изображений, либо с веб-сервера) - я получаю следующее в исходном коде в браузере:

<li><img src=160.jpg /></li>

В браузере не отображается изображение.

Что я делаю не так?

Ответы [ 3 ]

11 голосов
/ 16 марта 2010

Это длинный пост, в котором кратко изложены все, что я узнал о Django, чтобы заставить работать статические файлы (мне потребовалось некоторое время, чтобы понять, как все разные части сочетаются друг с другом).

Чтобы разместить статические изображения на вашем сервере разработки (а затем и на реальном сервере), вам нужно будет сделать несколько вещей (обратите внимание, в частности, на третий и четвертый этапы):

Набор MEDIA_ROOT

MEDIA_ROOT - это константа, которая сообщает Django физический путь к файлу (в вашей файловой системе). Используя ваш пример, MEDIA_ROOT должен быть установлен в «C: / siteURL / galleries /», как вы написали. MEDIA_ROOT будет использоваться в одном из следующих шагов, поэтому мы установили его.

Установить MEDIA_URL

MEDIA_URL - это URL-адрес, на котором располагаются ваши изображения. Другими словами, всякий раз, когда вы хотите получить изображение, URL для поиска начинается с MEDIA_URL. Обычно это , а не , начинающееся с «http», поскольку вы работаете со своего собственного сервера (мой MEDIA_URL обычно имеет значение «/ site_media /», что означает запуск с корневого домена, затем перейдите на site_media и т. д.)

Использовать MEDIA_URL

MEDIA_URL не работает по волшебству, вам действительно нужно его использовать. Например, когда вы пишете HTML, который получает файл, он должен выглядеть следующим образом:

<li><img src="{{MEDIA_URL}}/160.jpg" /></li>

Посмотрите, как я говорю шаблону использовать префикс MEDIA_URL? Это в конечном итоге переводится как 'http://some-good-URL/galleries/160.jpg'.

Обратите внимание, что для того, чтобы реально использовать MEDIA_URL в ваших шаблонах, вам нужно добавить строку 'django.core.context_processors.media' к вашему TEMPLATE_CONTEXT_PROCESSORS параметру в вашем файле settings.py, если я не ошибаюсь.

Заставьте ваш сервер dev обслуживать статические файлы

В реальной среде вы будете настраивать файлы с такими адресами, как «static_media», чтобы они обслуживались без прохождения через Django. Но в среде разработчиков вы также захотите обслужить их из Django, поэтому вам следует добавить эту общую строку в конец вашего файла urls.py:

if settings.DEBUG:
# Serve static files in debug.
urlpatterns += patterns('',
    (r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root': settings.MEDIA_ROOT,
    'show_indexes' : True}),
)

Обратите внимание, что это берет что-либо с URL-адресом "site_media / *" (который на самом деле является моим MEDIA_URL) и подает его из моей папки MEDIA_ROOT, где находится параметр MEDIA_ROOT.

Конечная нота

Что меня смутило, так это то, что многое здесь для удобства. Например, MEDIA_ROOT используется только в вашем шаблоне URL отладки, чтобы сообщить Django, откуда загружаться. И MEDIA_URL только для того, чтобы побудить вас не вводить абсолютные URL-адреса во все ваши HTML-файлы, потому что тогда, когда вы решите переместить файлы на другой сервер, вам придется вручную изменить их все (вместо того, чтобы просто изменить MEDIA_URL константа).

Конечно, ничего из этого не требуется: вы можете жестко закодировать шаблон отладочной ссылки с вашей собственной папкой, убедиться, что статические файлы действительно являются сервером с URL-адреса (посетив его в браузере), а затем код, который без с использованием параметра MEDIA_URL в HTML-файл, просто чтобы убедиться, что все работает.

5 голосов
/ 16 марта 2010

Это выглядит глючно ...:

r'^galleries/(landscapes)/(?P<path>.jpg)$'

этот RE будет сопоставлять имена изображений только с одним символом, начиная с суффикса jpg, а не с четырьмя (как, например, '160.jpg'). Может быть, вы имели в виду ...

r'^galleries/(landscapes)/(?P<path>.*jpg)$'

...

1 голос
/ 16 марта 2010

Воспринимайте это как нечто среднее между двумя предыдущими ответами, оба из которых хороши. Во-первых, ваше регулярное выражение неверно, как указала Алекс. Я бы предложил установить его как:

   (r'^local_media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}), # static content

Потому что вы, вероятно, тоже захотите серверные файлы css и js, а не только изображения. Это регулярное выражение заботится о любом статическом файле, который вы, возможно, захотите обслуживать.

Далее вам нужно указать MEDIA_URL для ваших тегов img. У вас есть:

<img src=160.jpg />

Вместо этого должно быть что-то вроде:

<img src=[YOUR MEDIA_URL]160.jpg />

Трюк, который я использую, прост. В верхней части моего views.py у меня есть следующий код:

from django.conf import settings
resp = {}
resp['MEDIA_URL'] = settings.MEDIA_URL

и затем я просто передаю соответствующий словарь каждому шаблону, который я отображаю. Теперь я могу написать те же теги img как:

<img src={{MEDIA_URL}}160.jpg />

Лучше всего то, что эту часть вашего кода можно использовать и в производстве (не в регулярных выражениях, а только в бите MEDIA_URL).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...