Django:404 模板中的静态文件

Posted

技术标签:

【中文标题】Django:404 模板中的静态文件【英文标题】:Django: static files in a 404 template 【发布时间】:2011-12-18 06:32:06 【问题描述】:

如何使用默认视图将样式表和图像包含到 404 页面模板中?

我在站点的templates 目录的根目录中创建了一个404.html 文件:

<!DOCTYPE html>
<html>
<head>
    % load static %
    <link rel="stylesheet" href="% get_static_prefix %css/404.css" />
</head>
<body class="page-404">
    <p>Not found.</p>
</body>
</html>

具有讽刺意味的是,没有找到404.css404.css 文件位于应用程序之一的 static 目录中。

服务器是manage.py runserver。在其他每个页面上,静态文件都提供得很好。

更新:在settings.py 中设置DEBUG = False 后,所有其他页面上的静态文件也停止提供服务。

【问题讨论】:

您使用的是哪个版本的 Django? 1.3 ? @Arthur Neves,1.3,是的。 【参考方案1】:

看来,staticfiles 应用确实可以与DEBUG = False 一起使用。只有它不会从单个应用程序的 static 目录中获取文件。它将提供来自全局STATIC_ROOT 目录(来自settings.py)的文件。

要将静态文件复制到STATIC_ROOT,您需要运行collectstatic command:

python manage.py collectstatic

【讨论】:

【参考方案2】:

因为竞赛处理器.static 已经在 TEMPLATE_CONTEXT 中了!您可以在模板中使用变量 STATIC_URL:follow doc:

https://docs.djangoproject.com/en/1.3/ref/templates/api/#django-core-context-processors-static

如果 TEMPLATE_CONTEXT_PROCESSORS 包含此处理器,则每个 RequestContext 都将包含一个变量 STATIC_URL,提供 STATIC_URL 设置的值。

我们还知道 404 视图处理程序使用 RequestContext 对象,以下代码取自 django.views.defaults.py:

return http.HttpResponseNotFound(t.render(RequestContext(request, 'request_path': request.path))) 

所以只需在您的模板中使用 STATIC_URL ,它应该可以工作!

【讨论】:

谢谢!我必须提到我正在使用django.contrib.staticfiles,但它不适用于DEBUG = False。如果将DEBUG 设置为True,则不会呈现404 模板。无论如何,% get_static_prefix % 等价于 STATIC_URL 【参考方案3】:

当我使用 DEBUG=True 时,我通常在我的根 urlconf 中有这个 sn-p:

(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    'document_root': settings.STATIC_ROOT),

【讨论】:

以上是关于Django:404 模板中的静态文件的主要内容,如果未能解决你的问题,请参考以下文章

django 网站对静态文件给出 404 错误

Django 1.7 - 提供静态文件

如何告诉我的 django 模板静态文件(dajax.core.js)在哪里?

Django静态文件404

在 django 开发中加载静态文件时出现 404 错误

django nginx静态文件404