如何在开发中为Django提供CSS?
我看了很多文档,但还是搞不懂。我运行了collectstatic命令,在我的应用和项目目录下都设置了/static/文件夹,还在settings.py文件里添加了STATIC_URL和STATIC_ROOT(不过我不知道它们是否设置正确),结果{{ 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()
我是不是漏掉了什么?通常我的问题都是一些很基础的东西,而计算机专业的人可能觉得理所当然,但我却没注意到。
4 个回答
静态文件的概念是,你可以把跟开发相关的媒体文件(比如css、js等)按应用来分发,并让静态文件应用来管理和收集这些资源,来自不同的地方。
你需要告诉静态文件应用在哪里查找静态文件(通过设置 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
在你运行 collectstatic 后,你会得到:
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 }))
看看这个链接:在开发中提供静态文件。你需要设置 STATIC_URL
和 STATICFILES_DIRS
,这样 django.contrib.staticfiles
才知道去哪里找文件。
这是我的设置方式。听起来你可能缺少了静态上下文处理器?
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
这个变量,你需要在 settings.py
中使用 django.core.context_processors.static
这个上下文处理器:
TEMPLATE_CONTEXT_PROCESSORS = (
# other context processors....
'django.core.context_processors.static',
# other context processors....
)
开发环境中的静态资源服务
Django 在生产环境中不会接收到静态资源的请求,但在开发环境中,我们就让 Django 来提供我们的静态内容。我们在 urls.py
中使用 staticfiles_urlpatterns
来告诉 Django 处理 static/*
的请求。
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# .... your url patterns are here ...
urlpatterns += staticfiles_urlpatterns()