Статические файлы Django не загружаются

Я новичок в Django, работаю над своим первым проектом и у меня проблема со статическими файлами.

Я создал простую систему аутентификации, используя 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-адрес на абсолютный путь к статической папке. Может ли кто-нибудь пролить свет на это?


person JimJay    schedule 18.04.2012    source источник


Ответы (3)


Ваша проблема в том, что вы не слушаете 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», чтобы использовать правила только для разработчиков, но в этом нет необходимости, и на самом деле я считаю это плохим советом.

person krs    schedule 20.04.2012
comment
Что ж, на самом деле в последнем случае необходимо обернуть это правило. Если вы посмотрите на код django, то увидите, что представление не проверяет DEBUG. - person Jan Segre; 26.02.2013
comment
В представление никогда не попадает, потому что ваш веб-сервер настроен для их перехвата и обслуживания статических файлов, поэтому проверка не требуется. - person krs; 08.04.2013

Возникают ли у вас проблемы при использовании сборки на сервере запуска или вы обслуживаете Apache или аналогичный? Я немного боролся с этим. Документация, которой я следую: https://docs.djangoproject.com/en/stable/howto/static-files/

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

person valdarin    schedule 18.04.2012

Помогает ли изменение STATIC_ROOT='' на STATIC_ROOT='/'?

Мне кажется, единственная разница в том, что static/pics03.jpg (относительный путь) существует на домашней странице, но не существует на другой.

Абсолютный путь /static/pics03.jpg существует в обоих случаях. Если изменение STATIC_ROOT не помогает, просто добавьте / в начало URL-адресов.

person mayhewr    schedule 18.04.2012