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
теперь используются только для загрузки пользователей (например, любой файл, созданный через FileField
s и ImageField
s, поэтому вам все еще нужно это, но вы никогда не будете вручную хранить что-либо там.
когда вы достигнете производства, ваш веб-сервер должен будет обслуживать оба 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)
обратите внимание, что в документации 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'),)