Django 1.7 - 提供静态文件

0 投票
4 回答
4871 浏览
提问于 2025-04-29 20:18

我正在按照官方文档的指引来提供静态文件,但在开发控制台中收到了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没有提供静态文件。我找不到我缺少了什么。任何建议都非常欢迎。

暂无标签

4 个回答

0

如果你在使用django-cms的时候遇到404错误(特别是你所有的静态文件的URL前面都加了“en-us”),我找到了一些步骤可以帮助你解决这个问题。

首先,在你的urls.py文件中关闭国际化的模式匹配,具体方法可以参考这里

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的配置会把patternsdjango.conf.urls中移除。

这样解决了重定向的问题,但我的静态文件还是找不到。我需要手动把静态文件的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的新手搞错了配置。但因为其他人可能也会遇到同样的问题,所以我把这个作为一个可能的解决方案分享出来,虽然不是最理想的。

0

这应该没问题 :)

settings.py 文件

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

这是 settings.py 文件中上下文处理器的一个例子:

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)
0

当你运行 collectstatic 命令时,它会把你所有的静态文件放到你指定的 STATIC_ROOT 路径下。你可以查看一下 生产环境部署的文档

如果你在使用 django 服务器,可以检查一下 {% static %} 生成的路径……可能是你多了一个斜杠或者少了什么东西。

确保你 满足所有要求。你需要在已安装的应用中包含 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)
6

解决方案:我在settings.py文件里漏掉了这一行。

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

看起来这行是必须的,就像TEMPLATE_DIRS一样。

撰写回答