Статические файлы Django не загружаются
Я новичок Django, работающий над моим первым проектом и имеющий проблемы со статическими файлами.
Я создал простую систему auth, используя django.contrib.auth
, состоящую из двух шаблонов: mysite/templates/index.html
и mysite/templates/registration/login.html
. У меня есть глобальный статический контент в mysite/static
, который я хочу иметь доступ ко всем шаблонам, отображаемым всеми приложениями.
mysite/templates/index.html
содержит <img src="{{ STATIC_URL }}pics03.jpg"/>
, который отображается как "static/pics03.jpg"
и загружается нормально, когда я нахожу URL-адрес localhost:8000/
mysite/templates/registration/login.html
содержит <img src="{{ STATIC_URL }}pics03.jpg"/>
, который также отображается как "static/pics03.jpg"
и не загружается, когда я нахожу URL-адрес "localhost:8000/accounts/login/"
В моем urls.py у меня есть:
urlpatterns = patterns('',
url(r'^$', 'mysite.views.home'), # plays index.html template
url(r'^accounts/login/$', 'django.contrib.auth.views.login'),
В моем settings.py у меня есть:
PROJECT_DIR = os.path.dirname(__file__)
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(PROJECT_DIR,'static'),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
STATIC_URL = '/static/'
STATIC_ROOT = ''
У меня создалось впечатление, что Django должен искать глобальный статический контент в STATICFILES_DIRS, но он не находит статический контент для login.html, даже если я изменяю URL-адрес там до абсолютного пути к статической папке. Может ли кто-нибудь пролить свет на это?
Ответы
Ответ 1
Ваша проблема заключается в том, что вы не слушаете URL "/static/" нигде в вашем urls.py
Если вы обслуживаете приложение через веб-сервер, например apache или nginx, это нормально, так как веб-сервер будет обрабатывать сами статические файлы.
Для разработки Django поставляется со встроенным статическим сервером
в urls.py, в самом конце добавить
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
Что это значит, это добавить /static/url и позволить вам обслуживать тех, у кого нет веб-сервера.
Это эквивалентно
url(
regex=r'^static/(?P<path>.*)$',
view='django.views.static.serve',
kwargs={'document_root': settings.STATIC_ROOT,}
)
некоторые люди скажут вам, что вам нужно обернуть URL-правила в "if settings.DEBUG", чтобы использовать правила только для dev, но это совсем не обязательно, и на самом деле я считаю, что это плохой совет.
Ответ 2
У вас возникли проблемы при использовании сборки на сервере запуска или вы используете Apache или подобное? Я немного с этим справился. Следующая документация: https://docs.djangoproject.com/en/dev/howto/static-files/
Вторая часть является ключом, когда вы готовы к развертыванию. Вам нужно определить статический корень (который будет пуст для начала) и запустить команду manage.py collectstatic
, чтобы переместить статические файлы из вашего проекта в эту папку. Тогда вы можете служить им оттуда.
Ответ 3
Помогает ли изменить STATIC_ROOT=''
на STATIC_ROOT='/'
?
Мне кажется, что единственная разница заключается в том, что static/pics03.jpg
(относительный путь) существует на домашней странице, но не на другом.
Абсолютный путь /static/pics03.jpg
существует в обоих случаях. Если изменение STATIC_ROOT
не помогает, просто добавьте /
в начало URL-адресов.