/ / Django statické súbory - chyba 404 pri pokuse o prístup - css, django, django-staticfiles

Statické súbory Django - chyba 404 pri pokuse o prístup - css, django, django-staticfiles

Ja som nasledovať gettingstartedwithdjango.com príručky, ale s novšími verziami kódu. Som na druhom tutoriále a som skoro na konci, ale nedokážem úspešne navrhnúť svoje stránky pomocou CSS kvôli 404 chybám pri servise obsahu statických súborov. Nie som si úplne istý prečo.

Používam Vagrant VM na vrchole Windows 7 pre Windows XPvývoj, / vagrant (vo VM) je mapovaný na C: / VAGRANT (vo Win7). Vytvoril som C: / VAGRANT / PROJEKTY, ktoré obsahujú všetky moje projekty. Vytvoril som pre svoj projekt virtuálny priestor, ktorý je umiestnený v adresári / home / vagrant / blog-venv (vo VM), obsah tohto projektu z perspektívy kódu je v C: / VAGRANT / PROJECTS / microblog.

ŠTRUKTÚRA SMERNICE

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

Na základe vyššie uvedenej štruktúry adresárov sú tu príslušné súbory a ich obsah:

/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 %}

NA RUNSERVER CHYBA I "M SEDING JE:

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

ATTEMPT NA PROBLÉMOVÚ DIAGNÓZU

Cesta hore prechádza správou „Nenájdené“ /css/bootstrap.min.css radšej než /static/css/bootstrap.min.css ma viedlo k presvedčeniu, že problém sa prejavuje v súbore /microblog/microblog/templates/_layouts/base.html tu:

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

Zdá sa, že {{STATIC_URL}} nie je interpretovaný, je to nastavená hodnota "/ static /", a preto je vyhľadávacia cesta /css/bootstrap.min.css skôr ako sa očakávalo /static/css/bootstrap.min.css, Áno, potvrdil som túto očakávanú cestua súbor existuje v skutočnom systéme súborov. Preto, keď sa stránka vykreslí, je to iba váš štandardný výstup HTML bez štýlu CSS, ktorý očakávam. V /microblog/microblog/templates/index.html súbor, class = "btn" nefunguje ani vykresľovanie správne.

Čítal som, že to môže súvisieť s hodnotami DEBUG a / alebo ALLOWED_HOSTS a samozrejme mám podozrenie na moje PATHS.

Poďme sa najprv vysporiadať s cestami. Môže to byť tak, že osvedčené postupy diktujú, že by som mal trochu upraviť svoje súčasné cesty, prosím, radiť (nedostatok skúseností tu), ale zatiaľ len sledujem to, čo mi bolo povedané, aby som urobil na webových stránkach tutoriálu. Nepoužívam pevne kódované cesty, potvrdil som tlmočenie po kóde (base.py) každej z mojich ciest, ako aj skutočnú existenciu každej z týchto zložiek v mojom súborovom systéme (pozri ŠTRUKTÚRA SMERNICE blok v hornej časti tohto príspevku):

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 ]

Pokiaľ ide o DEBUG, treba ho nastaviť"Pravda", to je prípad môjho súboru local.py, ktorý sa importuje, keď spustím Django lokálne, ale neimportuje sa, keď tlačím kód do výroby (local.py je vylúčený z produkčnej synchronizácie prostredníctvom .gitignore).

Pokiaľ ide o ALLOWED_HOSTS, uvidíte, že v súčasnosti mám hodnotu „*“, ktorá môže alebo nemusí byť vhodná. Neviem, nedostatok skúseností.

Všimol som si, že beží python manage.py collectstatic zbiera 0 súborov, ale nie som si istý prečo.

Všimnete si, že môj /microblog/microblog/urls.py obsahuje niekoľko riadkov, z ktorých som sa pokúsil vyriešiť tento problém, vyskúšal som rôzne veci.

Jedno ďalšie pozorovanie. Admin strana môjho projektu má predvolené štýly typické pre rozhranie Django Admin, ale stalo sa to až vtedy, keď som povolil STATICFILES_FINDERS s názvom django.contrib.staticfiles.finders.AppDirectoriesFinder, Domnievam sa, že je to preto, že to spôsobí, že Django pôjde pozrieť, kde sú súbory určené pre správcovskú aplikáciu. Pretože tieto neboli doteraz synchronizované s miestom STATIC_ROOT (pretože python manage.py collectstatic zlyháva), predpokladám, že sa pozerá na internetmiesto, kde môj VENV tieto súbory sprístupňuje (/home/vagrant/blog-venv/lib/python2.7/site-packages/django/contrib/admin). Môže to niekto potvrdiť? Pokiaľ ide o prednú časť projektu, tento kus má očividne stále problémy.

Pre Djanga som relatívne nový a veľmi uviazolo tomto probléme. V podstate sa to scvrkáva na to, aby statické súbory fungovali pre moju stránku ako celok, a bez toho som „mŕtvy“ vo vode, pretože budem potrebovať funkčnosť statických súborov aj pre ďalšie aspekty môjho projektu. Neviem, či existuje lepší spôsob, ako by som mal riešiť problémy alebo ladenie. Očakávam, že dostanem chybovú stránku prehliadača (pretože DEBUG = True), ktorá by mi pomohla tento problém ďalej zúžiť, ale napriek nastaveniu DEBUG to nedostanem. Tiež neviem, či existuje spôsob, ako python manage.py runserver s parametrami, ktoré by priniesli viac ladiaceho výstupu, prečo dostávam 404.

Akákoľvek pomoc alebo rada v súvislosti s týmto problémom ako celkom sa veľmi ocenia. Ak sú potrebné ďalšie informácie, vyžiadajte si a my odošleme aktualizáciu. Vopred ďakujem!

odpovede:

2 pre odpoveď č. 1

Na toto je skutočne kľúčový bod:

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

Na /static chýba predpona /static/css/bootstrap.min.css.

Ako dokumentácia vysvetľuje, mali by ste to zahrnúť do svojej šablóny, aby ste mohli používať statické súbory:

{% load staticfiles %}

A v moderných verziách Django namiesto:

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

Mali by ste používať:

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

toto static v šablóne sa objavila značka šablóny Django 1.4a od roku 2006 je uprednostňovaným prístupom.