【问题标题】:How do I serve CSS to Django in development?如何在开发中为 Django 提供 CSS?
【发布时间】:2011-11-29 00:52:54
【问题描述】:

我已经阅读了所有文档,但这对我来说毫无意义。我运行 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 专业人士认为理所当然的基本问题,但我想念。

【问题讨论】:

    标签: python django


    【解决方案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/,它们由不同的 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 为我们的静态内容提供服务。我们在urls.py 中使用staticfiles_urlpatterns 来告诉Django 处理对static/* 的请求。

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

    【讨论】:

    • 谢谢 - 我有处理器 - 你可以在我上面的文件中看到它。不过,您的设置确实对我有所帮助:我在 STATIC_ROOT 和 STATIC_URL 设置中使用了绝对路径。我已经修复了它,但我认为我仍然需要 STATICFILES_DIRS 中的绝对路径,对吧?
    • @StormShadow,你可以做os.path.join(os.dirname(__file__),"static"),假设你的静态文件与settings.py在同一目录中。
    • 我认为您没有提及您是使用 Django 开发服务器还是其他服务器(如 nginx 或 Apache)来提供文件。如果第二个问题可能与生产服务器的配置有关,而不是与项目中的配置设置有关。
    【解决方案2】:

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

    【讨论】:

    • 对。实际上,这就是我现在要说的。但它不起作用。我正在使用正斜杠并在 C:/ 处开始路径。有错吗?
    • 顺便说一句,它们都设置为相同的东西,因为我不知道哪个实际设置了 {{ STATIC_URL }} 变量。两者似乎都不起作用。
    • 它们不应该相同。 STATICFILES_DIRS 应该是您的文件当前所在的位置,STATIC_ROOT 应该是一个单独的文件夹,您希望在收集文件时将文件存放在该文件夹中,而 STATIC_URL 应该是您在使用站点/应用程序时要用来访问文件的路径跨度>
    【解决方案3】:

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

    当您将应用程序/网站放在生产服务器上时,您让网络服务器(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 }))
    

    【讨论】:

    • 是的,这也不起作用。它给了我“/show_project/ name 'settings' 处的 NameError 未定义”
    • 谢谢!但还是一无所获。我刚刚粘贴了我现在在那里得到的其他代码。也许我忘记了其中的一些东西?
    • 就像我在另一条评论中所说的那样,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()))
    

    【讨论】:

      猜你喜欢
      • 2015-08-06
      • 2012-03-25
      • 2014-03-17
      • 2012-05-08
      • 2015-09-22
      • 2013-01-24
      • 2012-06-04
      • 1970-01-01
      • 2012-03-01
      相关资源
      最近更新 更多