Я следую 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.
Любая помощь или консультация с этой проблемой в целом будет принята с благодарностью. Если какая-либо дополнительная информация требуется, просьба запросить, и я опубликую обновление. Заранее спасибо!
Большое спасибо за ваш ответ. Я тоже заметил «/ static», отсутствующий в запросе GET. У меня есть два проекта одновременно. Сначала вы используете метод, упомянутый выше, и основывается на онлайн-учебнике Django 1.9 (отлично работает). Второй - это то, что я описал выше, и следую за старым видеоуроком для Django 1.4. Я еще не преодолел пробел в обновлении кода проекта 1.4 с использованием более новых методов 1.9. Я чувствую себя немым для этого, но я верю, что ты ударил ноготь по голове с точки зрения того, что мне не хватает. Я скоро проверю и вернусь к вам с результатами. Ура! – Dan
Да, это сделал трюк. Спасибо вам за помощь. С новым годом. – Dan
Удивительный! Спасибо, что согласились! (недостаточно хорошо для + upvote? ;-) С Новым годом вам тоже! – janos