Django - Statische Datei nicht gefunden

80

Ich habe mehrere Beiträge zu diesem Problem gesehen, aber meine Lösung nicht gefunden.

Ich versuche, statische Dateien in meiner Django 1.3-Entwicklungsumgebung bereitzustellen.

Hier sind meine Einstellungen

...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  '/static/',
)
...

Meine urls.py

urlpatterns = patterns('',
...
  url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root', settings.STATIC_ROOT}
  ),
...
);

Mein / home / glide / Documents / django / cbox / static / Verzeichnis ist wie

css
  main.css
javascript
image

Beim Versuch, auf http://127.0.0.1:8000/static/css/main.css zuzugreifen, wird eine 404-Fehlermeldung angezeigt .

Muss ich Muster für CSS, Javascript und Bilder einzeln angeben?

Pierre de LESPINAY
quelle

Antworten:

108

Ich habe STATIC_ROOT und STATICFILES_DIRS verwechselt

Eigentlich habe ich den Nutzen von nicht wirklich verstanden STATIC_ROOT . Ich dachte, dass es das Verzeichnis ist, in das ich meine gemeinsamen Dateien legen muss. Dieses Verzeichnis für die Herstellung verwendet wird, dann ist dies das Verzeichnis auf dem statischen Dateien werden durch setzen (gesammelt) werden collectstatic .

STATICFILES_DIRS ist das, was ich brauche.

Da ich mich in einer Entwicklungsumgebung befinde , besteht die Lösung für mich darin, STATIC_ROOT nicht zu verwenden (oder einen anderen Pfad anzugeben) und mein gemeinsames Dateiverzeichnis in festzulegen Dateiverzeichnis STATICFILES_DIRS festzulegen :

#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static_files/'))
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATICFILES_DIRS = (
  os.path.join(SITE_ROOT, 'static/'),
)

Vergiss auch nicht from django.conf import settings

Pierre de LESPINAY
quelle
2
Nein, die urls.py sollte wie in der Frage sein (dasselbe gilt für Medien) und from django.conf import settingsnatürlich nicht vergessen
Pierre de LESPINAY
Ich möchte nur zu dieser Antwort hinzufügen, verpassen Sie nicht das s. Es sollte STATICFILES_DIRS sein. Ich habe STATICFILE_DIRS gemacht und mich 45 Minuten lang verrückt gemacht, um nach dem Fehler zu suchen.
niccolo m.
1
Ich benutze BASE_DIRstattdessen eingebaute const SITE_ROOTund es funktioniert.
Maduka Jayalath
32

Das Bereitstellen statischer Dateien kann auf verschiedene Arten erfolgen. Hier sind meine Notizen zu mir selbst:

  • Fügen Sie ein static/my_app/Verzeichnis hinzumy_app (siehe Hinweis zum Namespace unten).
  • Definieren Sie ein neues Verzeichnis der obersten Ebene und fügen Sie dieses zu STATICFILES_DIRS in settings.py hinzu (beachten Sie, dass The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting)

Ich bevorzuge den ersten Weg und ein Setup, das dem in der Dokumentation definierten Weg nahe kommt. Um die Datei admin-custom.csszum Überschreiben einiger Admin-Stile bereitzustellen, habe ich ein Setup wie das folgende:

.
├── my_app/
│   ├── static/
│   │   └── my_app/
│   │       └── admin-custom.css
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── static/
├── templates/
│   └── admin/
│       └── base.html
└── manage.py
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

Dies wird dann in der Vorlage wie folgt verwendet:

# /templates/admin/base.html
{% extends "admin/base.html" %}
{% load static %}

{% block extrahead %}
    <link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
{% endblock %}

Wenn Sie während der Entwicklung django.contrib.staticfiles [ed: standardmäßig installiert] verwenden, wird dies automatisch vom Runserver ausgeführt, wenn DEBUG auf True gesetzt ist [...]

https://docs.djangoproject.com/de/1.10/howto/static-files/

Bei der Bereitstellung führe ich collectstaticstatische Dateien mit nginx aus und stelle sie bereit.


Die Dokumente, die die Verwirrung für mich beseitigt haben:

STATIC_ROOT

Der absolute Pfad zu dem Verzeichnis, in dem collectstatic statische Dateien für die Bereitstellung sammelt.

... es ist kein Ort, an dem Sie Ihre statischen Dateien dauerhaft speichern können. Sie sollten dies in Verzeichnissen tun, die von den Findern von staticfiles gefunden werden. Dies sind standardmäßig Unterverzeichnisse von 'static /' app und alle Verzeichnisse, die Sie in STATICFILES_DIRS enthalten.

https://docs.djangoproject.com/de/1.10/ref/settings/#static-root


Namespace für statische Dateien

Jetzt können wir unsere statischen Dateien möglicherweise direkt in my_app / static / ablegen (anstatt ein weiteres my_app-Unterverzeichnis zu erstellen), aber es wäre tatsächlich eine schlechte Idee. Django verwendet die erste statische Datei, deren Name übereinstimmt. Wenn Sie eine statische Datei mit demselben Namen in einer anderen Anwendung hätten, könnte Django nicht zwischen ihnen unterscheiden. Wir müssen in der Lage sein, Django auf den richtigen zu zeigen, und der einfachste Weg, dies sicherzustellen, besteht darin, sie mit einem Namespace zu versehen. Das heißt, indem Sie diese statischen Dateien in einem anderen Verzeichnis ablegen, das für die Anwendung selbst benannt ist.

https://docs.djangoproject.com/de/1.10/howto/static-files/


STATICFILES_DIRS

Ihr Projekt verfügt wahrscheinlich auch über statische Assets, die nicht an eine bestimmte App gebunden sind. Zusätzlich zur Verwendung eines statischen / Verzeichnisses in Ihren Apps können Sie eine Liste von Verzeichnissen (STATICFILES_DIRS) in Ihrer Einstellungsdatei definieren, in der Django auch nach statischen Dateien sucht.

https://docs.djangoproject.com/de/1.10/howto/static-files/

ptim
quelle
28

Es konnte nur zwei Dinge geben settings.py die Ihnen Probleme bereiten.

1) STATIC_URL = '/static/'

2)

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

und Ihre statischen Dateien sollten sich im statischen Verzeichnis befinden, das sich im selben Verzeichnis wie die Projekteinstellungsdatei befindet.

Selbst wenn Ihre statischen Dateien nicht geladen werden, haben Sie dies möglicherweise beibehalten

DEBUG = False

Ändern Sie es in True (nur für Entwicklungszwecke). Wechseln Sie STATICFILES_DIRSin der Produktion einfach in den Pfad, in dem sich statische Dateien befinden.

Naren Yellavula
quelle
2
In meinem Fall war meine Umgebungsvariable für das Debuggen falsch. Ich habe es auf wahr gesetzt und jetzt funktioniert es
Smit Patel
Hi..Ich habe alle genannten Lösungen ausprobiert, aber es gibt mir immer noch 404. Kann mir bitte jemand helfen?
Mukul_Vashistha
8

Wenn Ihre statische URL korrekt ist, aber dennoch:

Nicht gefunden: /static/css/main.css

Vielleicht Ihr WSGI-Problem.

➡ Config WSGI dient sowohl der Entwicklungsumgebung als auch der Produktionsumgebung

==========================project/project/wsgi.py==========================

import os
from django.conf import settings
from django.contrib.staticfiles.handlers import StaticFilesHandler
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
if settings.DEBUG:
    application = StaticFilesHandler(get_wsgi_application())
else:
    application = get_wsgi_application()
HoangYell
quelle
6
  1. Sie können die entfernen STATIC_ROOT Zeile
  2. Oder Sie können einen anderen staticOrdner in einem anderen Verzeichnis erstellen . Angenommen, das Verzeichnis lautet: project\static Jetzt aktualisieren:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'project/static/')
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Was auch immer Sie tun, der Hauptpunkt ist STATICFILES_DIRSund STATIC_ROOTsollte nicht dasselbe Verzeichnis enthalten.

Ich weiß, es ist lange her, aber ich hoffe, die neuen Freunde können Hilfe bekommen

yuv
quelle
3

Ein weiterer Fehler kann darin bestehen, dass Ihre App nicht in der INSTALLED_APPSListe aufgeführt ist:

INSTALLED_APPS = [
    # ...
    'your_app',
]

Ohne es zu haben, können Probleme auftreten, wie das Nichterkennen Ihrer statischen Dateien, im Grunde aller Dateien, die Ihre App betreffen. Auch wenn es korrekt sein kann, wie in der richtigen Antwort vorgeschlagen, indem Sie Folgendes verwenden:

STATICFILES_DIRS = (adding/path/of/your/app)

Kann einer der Fehler sein und sollte überprüft werden, wenn dieser Fehler auftritt.

Aklank Jain
quelle
1

Ich habe festgestellt, dass ich meine DEBUGEinstellung in meinen lokalen Einstellungen verschoben habe , um sie durch einen Standardwert zu überschreiben False. Stellen Sie im Wesentlichen sicher, dass die DEBUG-Einstellung tatsächlich falsch ist, wenn Sie mit DEBUGund entwickeln runserver.

Daniel Butler
quelle
1

Ich löse dieses Problem, indem ich meinen Projektnamen in INSTALLED_APPS hinzufüge.Geben Sie hier die Bildbeschreibung ein

Saiful Islam
quelle
Dies hat das Problem für mich behoben, aber ich denke, ich brauche möglicherweise eine bessere Lösung. Jede App sollte in meinem Fall einen eigenen statischen Ordner haben
SeanDp32,
1
TEMPLATE_DIR=os.path.join(BASE_DIR,'templates')
STATIC_DIR=os.path.join(BASE_DIR,'static')

STATICFILES_DIRS=[STATIC_DIR]
Mumin
quelle
0

In Ihrem Befehl cmd type python manage.py findstatic --verbosity 2 static wird das Verzeichnis angegeben, in dem Django nach statischen Dateien sucht. Wenn Sie eine virtuelle Umgebung erstellt haben, befindet sich in diesem Ordner virtual_environment_name ein statischer Ordner. VIRTUAL_ENVIRONMENT_NAME\Lib\site-packages\django\contrib\admin\static. Wenn Django beim Ausführen des obigen Befehls 'findstatic' diesen Pfad anzeigt, fügen Sie einfach alle Ihre statischen Dateien in dieses statische Verzeichnis ein. Verwenden Sie in Ihrer HTML-Datei die JINJA-Syntax für href und suchen Sie nach anderen Inline-CSS. Wenn nach der Angabe der JINJA-Syntax immer noch ein Bild src oder eine URL vorhanden ist, stellen Sie ihm '/ static' voran. Das hat bei mir funktioniert.

Aansh Savla
quelle
0

Wenn Sie das django-storagesModul hinzugefügt haben (um beispielsweise das Hochladen von Dateien in S3 in Ihrer Django-App zu unterstützen) und wenn Sie wie ich die Dokumentation dieses Moduls nicht richtig gelesen haben , entfernen Sie einfach diese Zeile aus Ihrem settings.py:

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

Andernfalls werden Ihre statischen Assets NICHT auf Ihrem lokalen Computer, sondern remote im S3-Bucket, einschließlich Admin-Panel-CSS, angezeigt, wodurch das Admin-Panel-CSS effektiv beschädigt wird.

Overdrivr
quelle
0

STATICFILES_DIRS wird in der Entwicklung und STATIC_ROOTin der Produktion eingesetzt ,

STATICFILES_DIRS und STATIC_ROOT sollte nicht den gleichen Ordnernamen haben,

Wenn Sie in Entwicklung und Produktion genau denselben statischen Ordner verwenden müssen, versuchen Sie diese Methode

schließen Sie dies in ein settings.py

import socket

HOSTNAME = socket.gethostname()

# if hostname same as production url name use STATIC_ROOT 
if HOSTNAME == 'www.example.com':
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")

else:
    STATICFILES_DIRS = [
            os.path.join(BASE_DIR, 'static/'),
        ]
Shinto Joseph
quelle
-1

{'document_root', settings.STATIC_ROOT} muss sein {'document_root': settings.STATIC_ROOT}

oder Sie erhalten eine Fehlermeldung wie dictionary update sequence element #0 has length 6; 2 is required

Jens Timmerman
quelle