我跟随 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。
任何有关此问题的帮助或建议将不胜感激。如果需要任何进一步的信息,请索取,我将发布更新。提前谢谢!
答案 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中,自此以来一直是首选方法。