2015-12-23 6 views
1

Я следую getstartedwithdjango.com учебники, но с более новыми версиями кода. Я нахожусь во втором учебном пособии, и я близок к концу, но я не могу успешно стилизовать свой сайт с помощью CSS из-за 404 ошибок, обслуживающих содержимое статических файлов. Я не совсем понимаю, почему.Статические файлы Django - ошибка 404 при попытке доступа

Я использую Vagrant VM поверх Windows 7 для разработки,/бродяга (на виртуальной машине) сопоставляется с C:/VAGRANT (в Win7). Я создал C:/VAGRANT/PROJECTS, чтобы содержать все мои проекты. Я создал virtualenv для моего проекта, который находится в/home/vagrant/blog-venv (в виртуальной машине), содержимое для этого проекта с точки зрения кода находится в 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/set тинги/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> 

/микроблог/микроблог /templates/index.html

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

RUNSERVER ОШИБКА Я вижу IS:

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 побудил меня поверить, что проблема проявляется в/микроблог/микроблог/шаблоны/_layouts/основание.HTML файл здесь:

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

Оказывается, что {{}} STATIC_URL не интерпретируется на это его заданное значение «/ статический /» и, следовательно, путь поиска является /css/bootstrap.min.css вместо ожидаемого /static/css/bootstrap.min.css. Да, я подтвердил, что ожидаемый путь и файл существуют в реальной файловой системе. Соответственно, когда страница отображается, это просто ваш стандартный вывод HTML без стиля CSS, который я ожидаю. В файле /microblog/microblog/templates/index.html файл class = "btn" тоже не работает/отображается.

Я читал, что это может иметь отношение к значениям DEBUG и/или ALLOWED_HOSTS, и, конечно, я подозреваю, что мои PATHS.

Давайте рассмотрим пути в первую очередь. Возможно, что лучшие практики диктуют, что я должен немного корректировать свои текущие пути, пожалуйста, сообщите (отсутствие опыта здесь), но на данный момент я просто следую тому, что мне сказали сделать на веб-сайте учебника. В этом ключе и поскольку я не использую жестко закодированные пути, я подтвердил интерпретацию пост-кода (base.py) каждого из моих путей, а также фактическое существование каждой из этих папок в моей файловая система (см ТЕЛЕФОН.СПРАВ- СТРУКТУРА блока в верхней части этого поста) следующим образом:

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, вы увидите, что у меня есть значение '*', которое может быть или не быть подходящим. Я не знаю, недостаток опыта.

Я заметил, что работает python manage.py collectstatic собирает 0 файлов, но я не уверен, почему.

Вы заметите, что мой /microblog/microblog/urls.py имеет некоторые строки, прокомментированные из него, я пробовал различные вещи здесь, чтобы попытаться решить проблему.

Еще одно наблюдение. Административная часть моего проекта имеет стиль по умолчанию, характерный для интерфейса Django Admin, но это стало реальностью только после того, как я включил STATICFILES_FINDERS под названием django.contrib.staticfiles.finders.AppDirectoriesFinder. Я считаю, это потому, что это заставляет Django смотреть, где находятся файлы для приложения admin. Поскольку они не синхронизированы с местоположением STATIC_ROOT (потому что python manage.py collectstatic терпит неудачу), я предполагаю, что он смотрит в то место, где мой VENV делает эти файлы доступными (/ home/vagrant/blog-venv/Библиотека/python2.7/сайт-пакеты/Джанго/вно/администратора). Может ли кто-нибудь подтвердить это? Что касается front-end стороны проекта, у этой части, очевидно, все еще есть проблемы.

Я относительно новичок в Django, и я очень зациклен на этой проблеме. По сути, это сводится к тому, что статические файлы работают на моем сайте в целом, и без этого я как бы мертв в воде, так как мне понадобятся функции статических файлов для других аспектов моего проекта. Я не знаю, есть ли лучший способ для устранения неполадок или отладки. Я вроде бы ожидаю, что у меня появится страница с ошибкой браузера (с DEBUG = True), которая помогла бы мне сузить проблему, но я не получаю ее, несмотря на настройку DEBUG. Я также не знаю, есть ли способ python manage.py runningerver с параметрами, которые приведут к увеличению отладочной информации о том, почему я получаю 404.

Любая помощь или консультация с этой проблемой в целом будет принята с благодарностью. Если какая-либо дополнительная информация требуется, просьба запросить, и я опубликую обновление. Заранее спасибо!

ответ

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, и с тех пор он был предпочтительным.

+0

Большое спасибо за ваш ответ. Я тоже заметил «/ static», отсутствующий в запросе GET. У меня есть два проекта одновременно. Сначала вы используете метод, упомянутый выше, и основывается на онлайн-учебнике Django 1.9 (отлично работает). Второй - это то, что я описал выше, и следую за старым видеоуроком для Django 1.4. Я еще не преодолел пробел в обновлении кода проекта 1.4 с использованием более новых методов 1.9. Я чувствую себя немым для этого, но я верю, что ты ударил ноготь по голове с точки зрения того, что мне не хватает. Я скоро проверю и вернусь к вам с результатами. Ура! – Dan

+0

Да, это сделал трюк. Спасибо вам за помощь. С новым годом. – Dan

+0

Удивительный! Спасибо, что согласились! (недостаточно хорошо для + upvote? ;-) С Новым годом вам тоже! – janos

Смежные вопросы