Доступ к файлам "Медиа" в Django - PullRequest
54 голосов
/ 21 июня 2011

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

Я на своей машине для разработки. У меня есть папка media в корневом каталоге моего проекта.

В settings.py У меня есть: MEDIA_ROOT = '' и MEDIA_URL = '/media/'.

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

if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$',
            'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT, }),
    )

Но единственный способ получить медиафайлы - это сослаться на /media/media/ например. <img src="/media/media/image.png" />.

Я ожидаю (и хочу)
<img src="/media/image.png" />

Может кто-нибудь сказать мне, что здесь происходит, и дать мне простой рецепт для настройки обработки медиа-файлов?

Большое спасибо.


@ Тимми О'Махони - спасибо! эпический пост и очень понятный. Но это оставляет пару вопросов:

(1) Я должен использовать /media/ и /static/, а не media/ и static/ как MEDIA_URL и и STATIC_URL - я что-то упустил?

(2) Если collectstatic шланги /static/, куда вы помещаете CSS уровня сайта, например CSS-файлы сайта? Не в /static/, очевидно.

(3) Я поместил их в каталог '_' в корневом каталоге проекта и установил STATICFILES_DIRS, чтобы указать на него - и именно здесь сервер разработки получает свои статические файлы, несмотря на директиву urlpatterns. Если ЭТО не так, куда вы помещаете CSS уровня сайта во время разработки и каков рабочий процесс около collectstatic при их изменении - нужно ли редактировать их в одном месте и собирать их где-то еще после каждого редактирования?

Ответы [ 6 ]

163 голосов
/ 21 июня 2011

Настройка папки:

В корне вашего проекта должно быть что-то вроде:

/app1
/app2
/media
/static
/templates
urls.py
settings.py
manage.py

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

Папка static должна содержать все CSS / JS и другие материалыэто часть разработки сайта


Settings.py:

MEDIA_ROOT - это абсолютный путь сервера к статическомупапка упомянутая выше.Это означает, что это должно быть что-то вроде:

MEDIA_ROOT = "/User/Bob/Sites/MySite/Project_root/media/"

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

MEDIA_URL = "media/"

, что означает, что весь материал может быть просмотрен в http://example.com/media/

Аналогично, STATIC_ROOT должно быть что-то вроде

STATIC_ROOT = "/User/Bob/Sites/MySite/Project_root/static/"

и STATIC_URL be

STATIC_URL = "static/" 

Обслуживание файлов:

Теперь, когда вы сказали django, где находятся эти папкиДолжны быть и правильные URL-адреса для доступа к ним, необходимо правильно обслуживать все запросы к папкам.

Обычно, когда вы работаете, вы хотите, чтобы веб-сервер позаботился об обслуживании ваших статических файлов и файлов мультимедиа.

Если вы разрабатываете, вы можете просто заставить сервер разработки djangoслужить им для вас.

Для этого вы указываете ему направлять все запросы, поступающие на http://example.com/media, на ваш MEDIA_ROOT, а все запросы, поступающие на http://example.com/static, на ваш STATIC_ROOT.

Для этого вы добавляете несколько URL-адресов в URLS.py, например:

from django.conf import settings
if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        }),
        url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.STATIC_ROOT,
        }),
)

Дополнительно :

Если выЕсли у вас есть несколько приложений, каждое из которых имеет свои собственные файлы CSS и JS, вы, возможно, не захотите выбросить их в одну / static / папку.Возможно, было бы полезно поместить их в подпапки приложений, к которым они принадлежат:

/app1/static/ # Specific static folder
/app2/static/
/media/
/static/ # Root static folder

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

./manage collectstatic
26 голосов
/ 21 июня 2011

Почему вы установили значение MEDIA_ROOT пустым? Это должен быть путь к вашей медиа-директории. Поскольку, как вы говорите, ваши медиафайлы находятся в подкаталоге с именем media, вы должны поместить его в MEDIA_ROOT.

14 голосов
/ 10 сентября 2013

Я следовал процедуре Тимми, но получил ошибку, что нет имени модуля django.views. Когда я использую import django.views в моем virtualenv, все работает нормально, т.е. это не проблема с импортом библиотеки.

Однако мне удалось решить эту проблему, выполнив эту процедуру в моем основном файле urls

from django.conf.urls.static import  static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

https://docs.djangoproject.com/en/dev/howto/static-files/

6 голосов
/ 17 февраля 2018

У меня была такая же проблема, поэтому я добавил эти строки

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    url(r'', include('blog.urls')),
    url(r'^admin/', admin.site.urls),
    url(r'^cadmin/', include('cadmin.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

в urls.py в каталоге конфигурации проекта Django.дополнительная информация: https://overiq.com/django/1.10/handling-media-files-in-django/

3 голосов
/ 23 июля 2015

В вашем settings.py убедитесь, что вы добавили

django.core.context_processors.media

в свой TEMPLATE_CONTEXT_PROCESSORS. ИначеMEDIA_ROOT не будет работать, когда вы используете его в шаблонах.

1 голос
/ 29 марта 2017

Я использую Django 1.10.И моя папка мультимедиа 'uploads'. Это конфигурация в моих settings.py:

MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
MEDIA_URL = '/uploads/'

И в шаблоне я помещаю имя o MEDIA_URL перед de object.name вместо object.url следующим образом

    <img src="uploads/{{ imagen_identificativa.name }} " alt="{{imagen_identificativa}}">

И у меня это работает.Надеюсь, это поможет.

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