【问题标题】:Using static files with the django virtual server在 django 虚拟服务器上使用静态文件
【发布时间】:2012-06-17 12:20:20
【问题描述】:

以前有人问过类似的问题,我已经阅读了所有这些问题并试图理解有关该主题的官方 django 文档,但我仍在努力在虚拟服务器上使用静态文件。更具体地说,我只是想让我的模板Base.html 使用base.css.

我的文件夹结构如下:

manage.py
static/CSS/base.css
VergeGreenITEvent_Website/settings.py
VergeGreenITEvent_Website/views.py ect
VergeGreenITEvent_Website/Webpage_Templates/Base.html

(目前没有应用文件夹,因为我正在关注“The django book”来学习并且还没有做到这一点!)

完整的 settings.py 可以在这里查看:http://pastebin.com/JB3mKRcJ

在我的 Base.html 模板中,我现在有了代码:

<head>
    <title>Verge Green IT</title>
    {% load static %}

    <link rel="stylesheet" href="{% static "CSS/base.css" %}" type="text/css" />
</head>

CSS 仍然没有被应用。 你能帮我弄清楚我做错了什么吗?我将不胜感激。

我正在使用最新版本的 Django。 (1.4)


urls.py:

from django.conf.urls import patterns, include, url
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
import views

urlpatterns = patterns('',

    url(r'^$', views.Home),

)

if settings.DEBUG:
    urlpatterns += staticfiles_urlpatterns() #this serves static files and media files.
    #in case media is not served correctly
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
            }),
    )

【问题讨论】:

  • STATIC_URL 应该是 "/static/" 我会避免在您的目录命名中使用大写字母,请发布您的网址
  • @ArgsKwargs ,感谢我将其更改为 /static/。你的意思是文件urls.py?好的!但我不确定它会告诉你很多吗?正确的视图加载正常,html 就在那里,只是没有样式。
  • STATICFILES_DIRS = ( ... )之后的设置中添加print STATICFILES_DIRS,运行项目时会显示什么。在您的模板中 {% static "CSS/base.css" %} 生成的链接是什么?
  • 如果你正在使用新的 django 项目布局,其中设置位于项目的子目录中,你需要使用@noirbizarre 他的 PROJECT_ROOT 定义(使用 '..' 上一层)
  • 您不能在这样的样式表中使用 django 过滤器,您必须使用硬编码路径或浏览 stackoverflow 以获得动态样式表解决方案

标签: css django static-files django-staticfiles


【解决方案1】:

如果你使用的是 Django 1.4,那么我会使用静态标签:

{% load static %}

<link rel="stylesheet" href="{% static "CSS/base.css" %}" type="text/css" />

你可能在你的 url 中也需要这个,在开发文件中是通过 django 提供的

if settings.DEBUG:
    urlpatterns += staticfiles_urlpatterns() #this serves static files and media files.
    #in case media is not served correctly
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
            }),
    )

此外,在您的设置中,通常的做法是避免硬编码位置,这是一个示例(顺便说一下,您的设置中是否有静态文件查找器?

PROJECT_ROOT = path.dirname(path.abspath(__file__)) #gets directory settings is in

STATIC_ROOT = path.join(PROJECT_ROOT,'static-root')
# this folder is used to collect static files in production. not used in development

STATIC_URL =  "/static/"

STATICFILES_DIRS = (
    ('', path.join(PROJECT_ROOT,'static')), #store site-specific media here.
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

TEMPLATE_CONTEXT_PROCESSORS = (
    # other processors...
    "django.core.context_processors.static",
)

【讨论】:

  • 感谢您的回答!第一个问题-您发布的那一点 url.py 是否旨在替换我已经拥有的 urlpatterns 的定义(现在已在上面发布)?我还收到错误“未为您发布的那段代码定义名称'设置'。我认为我的设置中没有文件查找器,您可以在此处查看完整的 settings.py 文件:pastebin.com/R8bKXkGB。我考虑到测试目的,硬编码位置可能更容易,然后在我知道我的文件夹结构正确后进行更改,但我会尝试检查你现在发布的设置..
  • 哦,实际上我确实有这两个发现者。
  • 不能将这些 urlpatterns 附加到您的 urls 文件的底部。在 urls 文件的顶部添加 from django.conf import settings
  • 非常感谢您的帮助。我对您在示例代码中的设置进行了所有更改,它似乎没问题,但在导入设置后,我仍然在 urls.py 中遇到错误 - “未定义名称'staticfiles_urlpatterns'”
  • 需要导入函数才能使用,所以在顶部添加from django.contrib.staticfiles.urls import staticfiles_urlpatterns
【解决方案2】:

你应该这样写你的settings.py

import os
PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))

STATIC_URL = '/static/'  # Should be root relative or absolute

STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static'),
)

# Where your static files will be collected with colletstatic command
# I use it only in deployed configuration with DEBUG=False
# Need to be outside STATICFILES_DIR
STATIC_ROOT = '/var/www/your.site' 

为了确定,请使用 Firebug 或 webkit 调试器检查 CSS 是否已加载。

请记住,如果 settings.DEBUG == False,Django 将不会提供您的静态文件。

【讨论】:

  • 不要STATIC_ROOT 添加到STATICFILES_DIRS。这是不正确的,你不应该推荐它。 STATIC_ROOT 仅用于生产中collectstatic 的输出。它甚至不应该存在于开发中。
  • 我使用STATIC_ROOT 作为“您将STATIC_ROOT 设置为的目录”的通用名称,它几乎总是“静态”的。不要将同一目录添加到STATICFILES_DIRS。这就是我的观点。
  • 我不明白:我不会在任何地方这样做。这只是一个展示如何声明 STATICFILES_DIRS 和 STATIC_URL 的示例。你读的是 STATIC_ROOT 而不是 PROJECT_ROOT:我用它来声明简单的绝对路径。
  • 你这样做是因为在你的 staticfiles_dirs 元组 PROJECT_ROOT 中,'static' 会导致相同的位置
  • 我从未将 STATIC_ROOT 设置为同一目录。我编辑了我的回复以反映这一点。
猜你喜欢
  • 2015-07-08
  • 2013-12-08
  • 2015-12-24
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2018-03-29
相关资源
最近更新 更多