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

时间:2015-12-23 20:01:04

标签: css django django-staticfiles

我跟随 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 /微博。

目录结构

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

基于上述目录结构,以下是相关文件及其内容:

/微博/微博/设置/ __初始化__。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

在问题诊断时尝试

没有找到&#39;来自上面的消息,路径 /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}}似乎没有被解释为&#39; / static /&#39;因此查找路径是 /css/bootstrap.min.css 而不是预期的 /static/css/bootstrap.min.css 。是的,我已经验证了实际文件系统上存在预期的路径和文件。因此,当页面呈现时,它只是您的标准HTML输出而没有我期望的CSS样式。在 /microblog/microblog/templates/index.html 文件中, class =&#34; btn&#34; 也无法正常工作/呈现。

我读过这可能与DEBUG和/或ALLOWED_HOSTS的值有关,当然我怀疑我的PATHS。

让我们先处理这些路径。可能是最好的做法要求我应该稍微调整一下我当前的路径,请指教(这里缺乏经验),但是现在我只是按照我在教程网站上被告知做的事情。在那种情况下,由于我没有使用硬编码路径,我已经确认了每条路径的后代码解释( base.py ),以及实际的存在我的文件系统中的每个文件夹(请参阅本文顶部附近的 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需要设置为&#39; True&#39;,这是我的local.py文件中的情况,当我在本地运行Django但在将代码推送到生产时未导入时导入local.py通过.gitignore排除在生产同步之外。

关于ALLOWED_HOSTS,您会看到我目前的值为&#39; *&#39;这可能适合也可能不适合。我不知道,缺乏经验。

我注意到运行 python manage.py collectstatic 会收集0个文件,但我不确定原因。

您会注意到我的/microblog/microblog/urls.py已经注释了一些行,我在此尝试了各种方法来尝试解决此问题。

进一步观察。我的项目的管理员端具有Django Admin界面的典型默认样式,但只有当我启用名为 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 runserver 的参数可以产生更多的调试输出,以便我获得404。

任何有关此问题的帮助或建议将不胜感激。如果需要任何进一步的信息,请索取,我将发布更新。提前谢谢!

1 个答案:

答案 0 :(得分:2)

这是关键点:

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

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

正如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中,自此以来一直是首选方法。