Django 静态文件 - 访问尝试时出现错误 404

Django static files - error 404 on access attempt

我正在学习 gettingstartedwithdjango.com 教程,但使用的是较新版本的代码。我正在学习第二个教程,快结束了,但由于提供静态文件内容的 404 错误,我无法使用 CSS 成功地设置我的网站样式。我不太清楚为什么。

我 运行在 Windows 7 上安装一个 Vagrant VM 用于开发,/vagrant(在 VM 中)映射到 C:/VAGRANT(在 Win7 中)。我创建了 C:/VAGRANT/PROJECTS 来包含我所有的项目。我为我的项目创建了一个 virtualenv,它位于 /home/vagrant/blog-venv(在 VM 中),从代码的角度来看,该项目的内容位于 C:/VAGRANT/PROJECTS/microblog.

目录结构

PROJECTS
    static  # subdirs not auto-created yet as functionality not yet working
    uploads # subdirs not auto-created yet as functionality not yet working
    microblog
        manage.py <file>
        assets
            css
            fonts
            js
        microblog
            settings
            templates
                _layouts
        blog
            migrations
            templates
                blog

根据上述目录结构,这里是相关文件及其内容:

/microblog/microblog/settings/__init__.py

from .base import *
try:
    from .local import *
except ImportError:
    pass

/microblog/microblog/settings/base.py

DEBUG = False
here = lambda * x: os.path.join(os.path.abspath(os.path.dirname(__file__)), *x)
PROJECT_ROOT = here("..")
root = lambda * x: os.path.join(os.path.abspath(PROJECT_ROOT), *x)
TEMPLATES = [
    {
    'DIRS': [
        root("templates")
    },
]
MEDIA_ROOT = root("..", "..", "uploads")
MEDIA_URL = ''
STATIC_ROOT = root("..", "..", "static")
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    root("..", "assets"),
]
STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
ALLOWED_HOSTS = ['*']
DJANGO_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
THIRD_PARTY_APPS = []
LOCAL_APPS = [
    'blog',
]
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS

/microblog/microblog/settings/local.py

DEBUG = True

/microblog/microblog/urls.py

from django.conf.urls import url, include
from django.conf.urls.static import static
from django.contrib import admin
import blog.urls
from . import views, settings
admin.autodiscover()
urlpatterns = [
    url(r'^$', views.HomepageView.as_view(), name="home"),
    url(r'^blog/', include(blog.urls, namespace="blog")),
    url(r'^admin/', admin.site.urls),
    # url(r'^static/(.*)$', 'django.views.static.serve', {'document_root': settings.base.STATIC_ROOT}),
    ]# + static(settings.base.STATIC_URL, document_root=settings.base.STATIC_ROOT)

/microblog/microblog/views.py

from django.views.generic import TemplateView
class HomepageView(TemplateView):
    template_name = "index.html"

/microblog/blog/views.py

from django.shortcuts import render
from django.views.generic import ListView, DetailView
from .models import Post
class PublishedPostsMixin(object):
    def get_queryset(self):
        queryset = super(PublishedPostsMixin, self).get_queryset()
        return queryset.filter(published=True)
class PostDetailView(PublishedPostsMixin, DetailView):
    model = Post

/microblog/microblog/templates/_layouts/base.html

<!doctype html>
<html>
    <head>
        <title>{% block page_title %}{% endblock %}Microblog</title>
        <link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css">
    </head>
    <body>
        <div class="container">
            <h1>Welcome to my site!</h1>
            {% block page_content %}{% endblock %}
        </div>
    </body>
</html>

/microblog/microblog/templates/index.html

{% extends "_layouts/base.html" %}
{% block page_content %}
<a href="{% url 'blog:list' %}" class='btn'>Read my blog</a>
{% endblock %}

我看到的 RUNSERVER 错误是:

Performing system checks...
System check identified no issues (0 silenced).
December 23, 2015 - 11:13:14
Django version 1.9, using settings 'microblog.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

[23/Dec/2015 11:13:20] "GET / HTTP/1.1" 200 391
Not Found: /css/bootstrap.min.css
[23/Dec/2015 11:13:20] "GET /css/bootstrap.min.css HTTP/1.1" 404 2190

尝试问题诊断

从上面获取 'Not Found' 消息,路径 /css/bootstrap.min.css 而不是 /static/css/bootstrap.min.css 让我相信问题在 /microblog/microblog/templates/_layouts/base.html 文件中表现出来:

<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css">

似乎 {{ STATIC_URL }} 没有被解释为它是 '/static/' 的设置值,因此查找路径是 /css/bootstrap。min.css 而不是预期的 /static/css/bootstrap.min.css。是的,我已验证实际文件系统中确实存在预期的路径和文件。因此,当页面呈现时,它只是您的标准 HTML 输出,没有我期望的 CSS 样式。在 /microblog/microblog/templates/index.html 文件中, class="btn" 不是 working/rendering 也对。

我读到这可能与 DEBUG and/or ALLOWED_HOSTS 的值有关,当然我怀疑我的 PATHS。

让我们先处理一下路径。可能是最佳实践决定我应该稍微调整我当前的路径,请指教(这里缺乏经验),但现在我只是按照教程网站上的指示去做。在这种情况下,由于我没有使用硬编码路径,我已经确认了我的每条路径的 post-code-interpretation (base.py) ,以及我的文件系统中每个文件夹的实际存在(请参阅此 post 顶部附近的 DIRECTORY STRUCTURE 块),如下所示:

here() = /vagrant/PROJECTS/microblog/microblog/settings
PROJECT_ROOT = /vagrant/PROJECTS/microblog/microblog
root() = /vagrant/PROJECTS/microblog/microblog
TEMPLATES = [{'DIRS': = /vagrant/PROJECTS/microblog/microblog/templates }]
MEDIA_ROOT = /vagrant/PROJECTS/uploads
MEDIA_URL = ''
STATIC_ROOT = /vagrant/PROJECTS/static
STATIC_URL = '/static/'
STATICFILES_DIRS = [ /vagrant/PROJECTS/microblog/assets ]

关于DEBUG需要设置成'True',我的local.py文件就是这样的,我在本地运行 Django时导入,我在本地时没有导入将代码推送到生产环境(local.py 通过 .gitignore 从生产同步中排除)。

关于 ALLOWED_HOSTS,您会看到我目前的值“*”可能合适也可能不合适。不知道,经验不足

我注意到 运行ning python manage.py collectstatic 收集了 0 个文件,但我不确定为什么。

你会注意到我的 /microblog/microblog/urls.py 有一些行被注释掉了,我在这里尝试了各种方法来尝试解决这个问题。

进一步观察。我的项目的管理端具有典型的 Django 管理界面的默认样式,但这只有在我启用名为 django.contrib.staticfiles.finders.AppDirectoriesFinder 的 STATICFILES_FINDERS 时才成为现实。我相信那是因为这会导致 Django 去查看管理应用程序的文件所在的位置。由于这些尚未同步到 STATIC_ROOT 位置(因为 python manage.py collectstatic 失败),我假设它正在寻找我的 VENV 使这些文件可用的位置 (/home/vagrant/blog-venv/lib/python2.7/site-packages/django/contrib/admin)。谁能证实这一点?至于项目前端这块,明显还是有问题。

我是 Django 的新手,而且我对这个问题非常困惑。从本质上讲,这归结为让静态文件作为一个整体为我的网站工作,如果没有它,我就会陷入困境,因为我的项目的其他方面也需要静态文件功能。我不知道是否有更好的方法来进行故障排除或调试。我有点希望我会得到一个浏览器错误页面(因为 DEBUG=True),这将帮助我进一步缩小问题的范围,但尽管我进行了 DEBUG 设置,但我没有得到这个。我也不知道是否有一种方法 python manage.py 运行server 的参数会产生更多的调试输出,为什么我得到 404。

对于整个问题的任何帮助或建议,我们将不胜感激。如果需要任何进一步的信息,请提出要求,我会 post 进行更新。提前致谢!

这才是真正要看的重点:

[23/Dec/2015 11:13:20] "GET /css/bootstrap.min.css HTTP/1.1" 404 2190

/static/css/bootstrap.min.css 缺少 /static 前缀。

documentation 所述,您应该在模板中包含此内容以使用静态文件:

{% load staticfiles %}

而在 Django 的现代版本中,而不是:

<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css">

你应该使用:

<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">

static 模板标签出现在 Django 1.4 中,并且从那以后一直是首选方法。