Django не может найти мои медиафайлы (на сервере разработки)

средства массовой информации в настоящее время на моей локальной машине разработки.

My MEDIA_ROOT, MEDIA_URL, ADMIN_MEDIA_PREFIX и указаны ниже:

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), "media")
MEDIA_URL = '/media/'
SITE_URL = 'http://localhost:80'
ADMIN_MEDIA_PREFIX = '/media/admin/'

нет папки "admin", но это не должно иметь значения, я не думаю. В urls.py файл у меня:

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

Я в растерянности относительно того, что я должен сделать, чтобы заставить его работать. [Я пытаюсь изучить django и работаю с существующим проектом, который довольно волосатый]

4 ответов


вы смешиваете и сопоставляете статическую обработку файлов pre и post-Django 1.3. Первоначально все статические файлы обслуживались из MEDIA_URL, но Django 1.3 представил пакет staticfiles contrib и связанный STATIC_ROOT и STATIC_URL настройки. django.views.static.serve использует новое приложение staticfiles, которое вы не настроили.

предполагая, что вы используете Django 1.3, во-первых, вам нужно добавить "staticfiles" в свой INSTALLED_APPS. Затем вам нужно будет определить STATIC_ROOT и STATIC_URL. Стандарт location-это каталог корневого уровня проекта с именем "static".

вам также нужно добавить обработчик контекста шаблона staticfiles:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'django.core.context_processors.static',
)

это STATIC_URL переменная доступна в ваших шаблонах, поэтому вы можете ссылаться на свои ресурсы с помощью чего-то вроде {{ STATIC_URL }}css/style.css

все ваши статические ресурсы также должны будут перейти в каталог уровня приложения с именем "static". Фактический "статический" каталог корневого уровня проекта никогда не используется напрямую. Это просто место, где collectstatic команда управления сбрасывает все ваши статические ресурсы для использования в производстве.

если вы хотите статические ресурсы для всего проекта (не привязанные к какому-либо конкретному приложению), вам понадобится совершенно отдельный каталог (т. е. не такой же, как MEDIA_ROOT или STATIC_ROOT). Я склонен использовать один под названием "активы". Затем вам нужно будет сказать Django, чтобы посмотреть здесь статические ресурсы, а также с STATICFILES_DIRS настройка:

STATICFILES_DIRS = (
    os.path.join(os.path.dirname(__file__), 'assets'), # or whatever you named it
)

MEDIA_ROOT/MEDIA_URL теперь используются только для загрузки пользователей (например, любой файл, созданный через FileFields и ImageFields, поэтому вам все еще нужно это, но вы никогда не будете вручную хранить что-либо там.

когда вы достигнете производства, ваш веб-сервер должен будет обслуживать оба MEDIA_ROOT и STATIC_ROOT at MEDIA_URL и STATIC_URL, соответственно. Вам также нужно будет запустить:

$ python manage.py collectstatic

чтобы Django скомпилировал все ваши статические файлы в указанный каталог by STATIC_ROOT.


работает с django 1.8-1.11:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

https://docs.djangoproject.com/en/1.11/howto/static-files/#serving-files-uploaded-by-a-user-during-development

обратите внимание, что в документации Django указано, что это

не подходит для использования

(очевидно если вы используете if settings.DEBUG: часть)


на сервере разработки, эта страница может помочь вам. https://docs.djangoproject.com/en/1.2/howto/static-files/

путем добавления кода следования к urls.py:

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

С python-django 1.7 я использовал

 if settings.DEBUG:
        urlpatterns = patterns('',
            (r'^$', 'blenderx3d.first_step.views.index'),
            (r'^media/(?P<path>.*)$','django.contrib.staticfiles.views.serve'),)