#python #django
#python #django
Вопрос:
Я просмотрел всю документацию, и для меня это просто не имеет смысла. Я запустил collectstatic, я установил /static/ directories как в моем приложении, так и в каталогах моего проекта, я добавил STATIC_URL и STATIC_ROOT в свой settings.py file (но я понятия не имею, как узнать, правильно ли они установлены), а {{STATIC_URL }} по-прежнему ни во что не преобразуется. Все это кажется чертовски излишним просто для подключения html к css.
Я думаю, что я запутался в деталях; может ли кто-нибудь предоставить высокоуровневую разбивку этой идеи статических файлов? Боюсь, у меня могут быть смешанные инструкции как для производственных, так и для разработки.
ПОДРОБНЕЕ: Вот соответствующий фрагмент из моего settings.py файл:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
'django.contrib.staticfiles',
'dashboard.base',
)
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
)
STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = (
'C:/Users/Sean/Desktop/Work Items/dashboard/base/static/',
)
И это код, который я пытаюсь использовать в своем шаблоне:
<link rel="stylesheet" href="{{ STATIC_URL }}css/960.css" />
ОК. Я внес изменения, которые все рекомендовали. Вот мой новый urls.py:
from django.conf.urls.defaults import *
from base.views import show_project
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Example:
# (r'^dashboard/', include('dashboard.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
(r'^admin/', include(admin.site.urls)),
('^show_project/$', show_project),
)
if settings.DEBUG:
urlpatterns = patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT, 'show_indexes': True }),
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT, 'show_indexes': True }))
urlpatterns = staticfiles_urlpatterns()
Я что-то упускаю? Обычно мои проблемы оказываются чем-то действительно базовым, что профессионалы CS считают само собой разумеющимся, но я скучаю.
Ответ №1:
Вот как моя настройка. Похоже, вам может не хватать статического контекстного процессора?
STATIC_ROOT и STATIC_URL
В settings.py используется в разработке:
STATIC_ROOT = ''
STATIC_URL = '/static/'
И settings.py используется на моем производственном сервере:
STATIC_URL = '//static.MYDOMAIN.com/'
STATIC_ROOT = '/home/USER/public_html/static.MYDOMAIN.com/'
Итак, все статические файлы находятся в static/
. На рабочем сервере все эти файлы static/
собираются /home/USER/public_html/static.MYDOMAIN.com/
там, где они обслуживаются другим веб-сервером (в моем случае nginx), а не Django. Другими словами, мое приложение django (работающее на Apache) никогда даже не получает запросы на статические ресурсы в рабочей среде.
КОНТЕКСТНЫЙ ПРОЦЕССОР
Для того, чтобы шаблоны имели STATIC_URL
доступную для них переменную, вам необходимо использовать django.core.context_processors.static
контекстный процессор, также определенный в settings.py
:
TEMPLATE_CONTEXT_PROCESSORS = (
# other context processors....
'django.core.context_processors.static',
# other context processors....
)
СТАТИЧЕСКИЕ РЕСУРСЫ СЕРВЕРА В РАЗРАБОТКЕ
Django не получает запросы на статические ресурсы в процессе разработки, однако в процессе разработки мы просто позволяем Django обслуживать наш статический контент. Мы используем staticfiles_urlpatterns
in urls.py
, чтобы указать Django обслуживать запросы static/*
.
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# .... your url patterns are here ...
urlpatterns = staticfiles_urlpatterns()
Комментарии:
1. Спасибо — у меня есть процессор — вы можете увидеть его в моем файле выше. Ваши настройки мне помогли: я использовал абсолютные пути в настройках STATIC_ROOT и STATIC_URL. Я исправил это, но я думаю, что мне все еще нужны абсолютные пути в STATICFILES_DIRS, верно?
2. @StormShadow, вы могли бы сделать
os.path.join(os.dirname(__file__),"static")
, предполагая, что ваши статические файлы находятся в том же каталоге,settings.py
что и .3. Я думаю, что вы не упоминаете, обслуживаете ли вы свои файлы с помощью сервера разработки Django или другого сервера, такого как nginx или Apache. Если второе, то проблема может быть связана с конфигурацией вашего производственного сервера, а не с настройками конфигурации в вашем проекте.
Ответ №2:
Посмотрите на обслуживание статических файлов в разработке. Вам нужно определить STATIC_URL
и STATICFILES_DIRS
сообщить django.contrib.staticfiles
, где искать файлы.
Комментарии:
1. Правильно. На самом деле, это то, от чего я сейчас ухожу. Но это не работает. Я использую косые черты и начинаю пути с C:/ . Это неправильно?
2. Кстати, для них обоих установлено одно и то же значение, поскольку я не знаю, что на самом деле устанавливает переменную {{ STATIC_URL }} . Похоже, ни один из них не работает.
3. Они не должны быть одинаковыми. STATICFILES_DIRS должен находиться там, где в данный момент находятся ваши файлы, STATIC_ROOT должен быть отдельной папкой, в которой вы хотите, чтобы ваши файлы заканчивались при их сборе, а STATIC_URL должен быть путем, который вы хотите использовать для доступа к своим файлам при использовании вашего сайта / приложения
Ответ №3:
Идея идеи статических файлов заключается в том, что вы можете распространять медиафайлы, связанные с разработкой (css / js и т. Д.), Для каждого приложения и разрешать приложению static files управлять всеми этими ресурсами и собирать их из разных мест.
Итак, вы указываете приложению static files, где искать статические файлы (с помощью настроек STATICFILES_DIRS), куда их копировать (STATIC_ROOT) и какой путь для доступа к ним (STATIC_URL). Когда вы запускаете collectstatic, он выполняет поиск по каталогам и копирует все найденные файлы в статический корень.
Преимущество этого заключается в том, что вы можете управлять своими статическими файлами на более высоком уровне:
project/app1/static/css/ # These are css/js for a particular app
project/app2/static/css/
project/app3/static/css/
project/static/css # These might be general css/js for the whole project
static/ # This is where the collectstatic command will copy files to
и после того, как вы соберете их, у вас будет:
project/app1/static/css/
project/app2/static/css/
project/app3/static/css/
project/static/css
static/app1/css/
static/app2/css/
static/app3/css/
static/css/
Когда вы размещаете свое приложение / сайт на рабочем сервере, вы позволяете веб-серверу (apache, nginx) обрабатывать файлы, указывая ему обслуживать медиафайлы в /static/ или /media/ напрямую, передавая все остальные запросы приложению. Однако при разработке проще позволить серверу разработки сделать это за вас.
Для этого вы должны явно указать серверу любой запрос на медиа в /static/ (ваш STATIC_URL). В вашем urls.py , поместите следующее (или аналогичное)
from django.conf import settings
...
if settings.DEBUG:
urlpatterns = patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT, 'show_indexes': True }),
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT, 'show_indexes': True }))
Комментарии:
1. Да, это тоже не работает. Это дает мне «Ошибка имени в / show_project / name ‘settings’ не определена»
2. Спасибо! Но все равно ничего не получается. Я только что вставил другой код, который у меня есть прямо сейчас. Может быть, я что-то забыл в этом?
3. Как я уже говорил в другом комментарии, STATIC_URL и STATIC_ROOT не должны быть одинаковыми. STATIC_ROOT нуждается в ‘static /’ или подобном
Ответ №4:
У меня такая же проблема, и я ищу много ответов, но никто не дает мне правильного ответа. Проблема в том, что вы не используете RequestContext, я думаю. Вы должны сделать RequestContext в качестве параметра шаблона, например
c = RequestContext(request, {
'foo': 'bar',
})
На мой взгляд, это:
return render_to_response('parts/test2.html', RequestContext(request, locals()))