如何在开发中为Django提供CSS?

时间:2011-10-01 12:50:17

标签: python django

我一直都在阅读文档,这对我来说没有意义。我运行了collectstatic,我在我的应用程序和项目目录中设置/ static /目录,我将STATIC_URL和STATIC_ROOT添加到我的settings.py文件中(但我不知道如何知道它们是否设置正确)和{{ 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专业人员认为这是理所当然的,但我想念。

4 个答案:

答案 0 :(得分:4)

以下是我的设置方式。听起来你可能会错过静态上下文处理器吗?

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/,在那里它们由不同的Web服务器(在我的情况下为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中使用urls.py告诉Django为static/*提供请求。

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# .... your url patterns are here ...
urlpatterns += staticfiles_urlpatterns()

答案 1 :(得分:2)

看看Serving static files in development。您需要定义STATIC_URLSTATICFILES_DIRS,让django.contrib.staticfiles知道在哪里查找文件。

答案 2 :(得分:2)

静态文件理念背后的想法是,您可以基于每个应用程序分发与开发相关的媒体文件(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

在你收集静止之后,你会有:

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/

当你将app / site放在生产服务器上时,你让webserver(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 }))

答案 3 :(得分:0)

我有同样的问题,并搜索了很多答案,但没有人给我正确答案。 问题是你不要使用RequestContext我认为。 您应该将RequestContext作为模板的参数,如

c = RequestContext(request, {
    'foo': 'bar',
})

在我看来是:

return render_to_response('parts/test2.html', RequestContext(request, locals()))