Django 1.7 - 提供静态文件

Posted

技术标签:

【中文标题】Django 1.7 - 提供静态文件【英文标题】:Django 1.7 - Serving static files 【发布时间】:2014-12-22 05:26:18 【问题描述】:

我正在关注official documentation 以提供静态文件,但我在开发控制台中收到错误 404。我正在使用 'django.contrib.staticfiles',所以应该自动提供静态文件。这是我的设置:

设置:

STATIC_ROOT = ''
STATIC_URL = '/static/'

模板标题:

% load staticfiles %
<link rel="stylesheet" href="% static "css/app.css" %">

目录树:

django_project
    \apps
    \static
        \css
            app.css
    \templates
        index.html

我可以在 Firefox 控制台中看到我的文件的路径是正确的:

所以问题一定是 Django 没有提供静态文件。我找不到我缺少的东西。任何建议都非常受欢迎。

【问题讨论】:

我认为代码有错字:"% static "css/app.css" %",你应该用单引号替换一对双引号。 【参考方案1】:

解决方案: 我的 settings.py 中缺少这一行

STATICFILES_DIRS = (os.path.join(os.path.dirname(__file__),'static'),)

看起来是强制的,和 TEMPLATE_DIRS 一样。

【讨论】:

我也尝试过使用 STATIC_ROOT,但在这个版本的 Django 中已弃用,所以只有 STATIC_URL、STATICFILES_DIRS 和 DEBUG=True 才需要。【参考方案2】:

当您运行 collectstatic 时,它会将所有静态内容放在 STATIC_ROOT 指定的路径中。检查deploy to production docs

如果您使用的是 django 服务器,请尝试检查由 % static % 生成的路径...您可能有一些尾部斜杠或缺少某些内容。

检查您是否拥有following all the requirements。您需要在已安装的应用程序中包含 django.contrib.staticfiles,并在主 urls 文件中包含类似的内容:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

【讨论】:

【参考方案3】:

应该可以的:)

settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'project', "static"),
)

settings.py 中的 context_processors 示例:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.static",
    'django.core.context_processors.request',
    "django.core.context_processors.tz",
    "django.contrib.messages.context_processors.messages",
)

settings.py 中已安装应用的示例:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

urls.py:

from django.conf import settings
from django.conf.urls.static import static
if settings.DEBUG:
    urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

【讨论】:

实际上,您需要在 1.7 中提供静态文件的唯一内容是设置中的 STATIC_URL、STATICFILES_DIRS 和 'django.contrib.staticfiles'。然后你只需要在你的模板中使用任何静态文件,比如 % static "css/app.css" %。因此,幸运的是,您不需要像以前的版本那样在 urls.py 中显式提供静态文件。【参考方案4】:

对于任何运行 django-cms 并遇到 404 错误的人(特别是,您的所有静态文件都在 URL 前加上“en-us”),我发现以下步骤可以提供帮助。

首先,在你的 urls.py 文件中关闭模式匹配的国际化 as described here:

urlpatterns = i18n_patterns('',
      url(r'^admin/', include(admin.site.urls)),
      url(r'^', include('cms.urls')),
)

应该是:

from django.conf.urls import patterns

urlpatterns = patterns('',
  url(r'^admin/', include(admin.site.urls)),
  url(r'^', include('cms.urls')),
)

导入很重要,因为 django-cms 的配置从 django.conf.urls 中删除了 patterns 导入。

这解决了重定向,但它仍然没有找到我的静态文件。我需要手动将静态 url 添加到 url 模式中,如下所示:

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('cms.urls')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

之后,静态文件按预期工作。

我确定这可能与我作为一个 Django 新手搞砸了我的配置有关。但由于其他人可能有同样的问题,我把它作为一个可能的解决方案,如果不太理想的话。

【讨论】:

以上是关于Django 1.7 - 提供静态文件的主要内容,如果未能解决你的问题,请参考以下文章

配置 STATIC_ROOT 时 Django 不提供静态文件

提供静态文件 django 1.9 生产错误

在 Django 中“有条件地”提供静态文件

在 Elasticbeanstalk Docker 环境中提供 Django 静态文件

如何通过 HTTPS 提供 Django 静态文件?

Django提供静态文件服务