Подтвердить что ты не робот

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

4b9b3361

Ответ 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-адресов.