Доступ к файлам "Media" в Django - программирование
Подтвердить что ты не робот

Доступ к файлам "Media" в Django

Я хотел бы любить 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, когда вы их изменяете - вам нужно редактировать их на одном месте и собирать их где-то еще после каждого редактирования?

4b9b3361

Ответ 1

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

Ответ 2

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

Ваш корень проекта должен выглядеть примерно так:

/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.

Для этого вы добавляете некоторые URLS в 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,
        }),
)

Extra

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

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

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

./manage collectstatic

Ответ 3

Я следил за процедурой timmy, но получил ошибку, которая не имеет имени модуля 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/

Ответ 4

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

django.core.context_processors.media

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

Ответ 5

Я использую Django 1.10. И моя медиа-папка - это "uploads" Это настройка в моих настройках .py:

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

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

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

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