Statische Django-Dateien 404

78

Ich kann meine statischen Dateien nicht aufrufen. Ich habe verschiedene Einstellungen und Verzeichniskonfigurationen usw. ausprobiert, aber sie werden nur als 404 angezeigt. Ich habe debug_toolbar installiert, damit Sie wissen, dass STATIC_URL meinen Anforderungskontext erreicht.

Verzeichnisstruktur zeigt / static (Ich habe das Verzeichnis auch im Ordner der Mahlzeiten-App abgelegt, und Benutzer, nur um es auszuprobieren.

/mealmate
    /mealmate
    /meals
    /static
        /css
             /bootstrap.min.css
    /templates
    /users

Settings.py (einige wichtige Einstellungen, obwohl ich mit einer Vielzahl anderer experimentiert habe):

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')

STATIC_URL = '/static/'

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

WSGI_APPLICATION = 'mealmate.wsgi.application'

In base.html gerendert

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

Irgendwelche Ideen? Vielen Dank

So ein Typ
quelle
7
Warum muss ich collectstatic ausführen, wenn ich manuell einen statischen Ordner erstellt habe? Ich habe es trotzdem getan, aber es hat immer noch nicht funktioniert. Django erkennt meinen statischen Ordner trotz der Einstellungen nicht.
KindOfGuy
38
Versuchen Sie: um python manage.py findstatic --verbosity 2 css/styles.csszu sehen, wo Django nach Ihren statischen Dateien sucht.
deed02392
4
@ deed02392 Ich weiß, dass dies eine lange Zeit später ist, aber DANKE, ich konnte nicht herausfinden, warum meine nicht funktionierte. Egal wie sehr ich versucht habe, STATIC_URLmeine Einstellungen zu ändern , es würde nicht funktionieren. Dann hilft mir dieser Befehl, den Ort zu finden. Ich weiß nicht, warum er sich nicht ändern würde
Charles Smith,
1
Ich bin froh, dass es @Amon geholfen hat, es war der Schlüsselbefehl, um herauszufinden, was auch los war
deed02392

Antworten:

125

Dies ist die funktionierende Lösung für den statischen / Medien- / Vorlagenzugriff in Django für Windows.

settings.py

import os.path

STATIC_ROOT = ''

STATIC_URL = '/static/'

STATICFILES_DIRS = ( os.path.join('static'), )
Amar Kamthe
quelle
4
Danke großartig! Für weitere Informationen folgen Sie blog.xjtian.com/post/52685286308/… diesem Blog, eine sehr praktische Beschreibung, wie man mit statischer Aufladung in Django dient.
Der Pate
10
os.path.join('static')gibt einfach'static'
Sławomir Lenart
Das hat mir auch geholfen. Um das Problem in meinem Fall genauer zu identifizieren, hatte ich ein führendes "/" in meiner join () - Zeichenfolge.
Matthew Weber
STATIC_ROOTSpezifikation ist nicht erforderlich. Und wie @ SławomirLenart betonte, können Sie das loswerden joinund einfach die Zeichenfolge verwenden.
Cirrusio
3
@cirrusio STATIC_ROOT ist eigentlich das, was für mich erforderlich war. Ich habe das Tutorial verfolgt und konnte keine statischen Dateien laden. Ich habe einfach die Zeile STATIC_ROOT = '' hinzugefügt und es hat funktioniert. Ich brauchte keine weiteren Änderungen.
Jeffrey Harmon
48

Für mich stellte sich heraus, dass dies dadurch verursacht wurde, dass das Debug auf false in gesetzt wurde settings.py. Eine Problemumgehung besteht darin, den --insecureSwitch an zu übergeben runserver. Die eigentliche Lösung besteht jedoch darin, einen geeigneten Webserver zu verwenden, um die statischen Dateien bereitzustellen. Weitere Informationen finden Sie in den Antworten auf diese Frage .

Arthur Tacca
quelle
2
Kumpel. Nach stundenlangen Versuchen löste dies das Problem. DANKE
М.Б.
DANKE ++ Ich wurde verrückt.
NiKo
Dies! Vielen Dank, es ist fast verrückt geworden, meine statischen Dateien zu debuggen ...
jpdus
yyyuuup. Das hat auf einem Produktionsserver funktioniert, aber einer meiner Entwickler hatte Probleme mit dem lokalen Runserver unter Windows. Es stellte sich heraus, dass das Debuggen lokal aktiviert werden muss :-) Danke! :-)
CeDeROM
21

Wenn Sie dies auf einem Webserver ausführen, kopieren Sie die statischen Dateien in einen öffentlich zugänglichen Ordner? Zum Beispiel:

# web accessible folder
STATIC_ROOT = '/home/your_name/www/mealmate/static/'

# URL prefix for static files.
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
    # location of your application, should not be public web accessible 
    '/home/your_name/website/mealmate/static',
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

Dann können Sie diesen Beitrag Django statische Dateien verwenden und die statischen Dateien mit manage.py in den öffentlich zugänglichen Ordner kopieren

# --link    Create a symbolic link to each file instead of copying.
# --noinput Do NOT prompt the user for input of any kind.
#
python manage.py collectstatic -link --noinput

Hoffentlich hilft das!

Eodgooch
quelle
Sind die URIs absichtlich unterschiedlich? ( wwwvs website)?
Rikki
@Rikki ja, um zu zeigen, dass Sie zusätzliche statische Dateiverzeichnisse hinzufügen können. Django wird alle Dateien in diesen Verzeichnissen bündeln und um STATIC_ROOT
17:33 Uhr
8

aus den obigen Kommentaren - führen Sie dies aus

python manage.py findstatic --verbosity 2 css/styles.css

Für 'css / styles.css' wurde keine passende Datei gefunden.

Suchen Sie an folgenden Orten:
/ Benutzer / Ihr Name / Dokumente / Arbeitsbereich / Test / statische Dateien

Ich habe meinen statischen Ordner einfach in statische Dateien umbenannt und alles war gut. (Ich bin auf osx + django 1.x)

Die Verwendung des unsicheren Modus kann nicht schaden, wenn Sie sich in einer lokalen Entwicklungsbox befinden. Andernfalls werden möglicherweise immer noch 404 Fehler angezeigt.

python manage.py runserver --insecure

AKTUALISIEREN

tatsächlich in settings.py graben fand die verletzende Linie.

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'staticfiles'),
)
Johndpope
quelle
8

Wenn Sie kürzlich das Debug in der Einstellungsdatei auf false geändert haben. Befolgen Sie diese Prozedur.

Meistens wird die Debug-Einstellung in settings.py als falsch eingestuft. Wenn Sie den Schalter --insecure an runserver übergeben, sollte dies funktionieren. Also, wenn Sie python manage.py runserver 0.0.0.0:8000es python manage.py runserver 0.0.0.0:8000 --insecurestattdessen ändern .

Es sollte funktionieren.

Kunal Kumar
quelle
2
Nach dem Lesen der Dokumente nehme ich an, dass Django Statik mit aktiviertem Dev-Modus dient. Auf der anderen Seite sollten Sie für den ausgeschalteten Dev-Modus wirklich Nginx verwenden, da das Bereitstellen der Statik von Django ineffizient ist. Die obige Flagge bedeutet, dass Sie diese Tatsache anerkennen.
Adam
7

Ich habe einfach das Äquivalent von hinzugefügt

STATICFILES_DIRS = (
    '/absolute_path_to_project/mealmate/static',
)

um das zum Laufen zu bringen. Ersetzen absolute_path_to_projectSie natürlich Ihren tatsächlichen Pfad und fügen Sie gegebenenfalls den Laufwerksbuchstaben hinzu.

Seth
quelle
6

Ich steckte auch im 404-Problem fest, bis mir klar wurde, dass Apache die Anforderungen an das statische Verzeichnis blockiert hatte. Ich habe python manage.py collectstaticalle statischen Dateien in das statische Verzeichnis unter meinem Projektstamm kopiert , dh / var / my / site / static . Mit

Alias /static /var/my/site/static
<Directory /var/my/site/static>
        Require all granted
</Directory>

In /etc/httpd/conf/httpd.conf funktioniert es jetzt ordnungsgemäß.

Wenn keine der oben genannten Antworten funktioniert, können Sie Ihre Serverkonfiguration überprüfen.

Darwin
quelle
1
Ich hatte den Alias ​​so eingestellt, Alias /static/ /var/my/site/static wie er auf docs.djangoproject.com/de/1.11/howto/deployment/wsgi/modwsgi/… steht , und den ersten Aufruf geändert , um /staticdas Problem für mich zu beheben. Vielen Dank!
andrewec
4

Stellen Sie sicher, dass sich Mealmate in Ihrem INSTALLED_APPS befindet

Chrisortman
quelle
4

In meinem Fall musste ich den Server nur erneut ausführen:

python manage.py runserver
Davor Josipovic
quelle
2

Ich gehe davon aus, dass Sie hier Django1.3 + verwenden.

Zunächst müssen Sie einige weitere Einstellungen definieren:

STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

STATICFILES_DIRS = [
    path.join(TOP_DIR, 'static'),
]

STATIC_ROOT = path.join(TOP_DIR, 'staticfiles')
STATIC_URL = '/static/'

Dies sollte Ihnen helfen, dieses Verzeichnis zu finden.

Außerdem sollten Sie immer auf Ihre statischen Dateien zugreifen, indem Sie STATIC URL:

<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css">
Zeichner
quelle
1
Hallo, ich verwende {{STATIC_URL}}. Es war ein bisschen unklar, das HTML, das ich zeigte, war die gerenderte Datei, um zu demonstrieren, dass das Tag funktionierte. Ich arbeite lokal, daher dachte ich, dass nur eine STATIC_URL-Einstellung erforderlich ist, solange das Verzeichnis / static vorhanden ist.
KindOfGuy
2

In Django haben Sie noch einen Vorteil für Ihre Vorlagen und Sie können Statiken wie diese verknüpfen, und vielleicht ist dies Ihr Problem!

<script src="{% static 'myapp/bootstrap.min.js' %}"></script>
<link href="{% static 'myapp/bootstrap.css' %}" rel="stylesheet" type="text/css"/>

es ist besser zu benutzen

{% statischer 'Dateiname'%}

und es ist auch einfacher, mehr darüber zu erfahren, ich verweise auf https://docs.djangoproject.com/de/1.11/intro/tutorial06/

Ebrahim Karimi
quelle
1

unten hinzufügen in setting.py

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
Yasin Lachini
quelle
0

Ich denke, Sie haben es versäumt, die App INSTALLED_APPS in Ihre settings.py-Datei aufzunehmen. Sie sollten "eatmate" hinzufügen.

INSTALLED_APPS = (
    'mealmate',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

Danach sind die statischen Dateien und die Befehlsdateien für Django sichtbar. Ich hatte Probleme mit Befehlen und so habe ich es behoben.

Omar Alvarado
quelle
0

auf Cpanel ist dies eine gute Lösung hier

auf dem Terminal auf dem Panel installieren Sie dj-static static3

pip install dj-static static3

Ersetzen Sie dann in wsgi.py diese Code-Py-Anwendung

from dj_static import Cling

application = Cling(get_wsgi_application())
Youssri Abo Elseod
quelle
0

Ich stand vor dem gleichen Problem. Hier, wie ich den Zugriff auf statische Dateien in der Vorlage löse.

Mein Django-Projekt (Recognition /) -Dateiverzeichnis sieht folgendermaßen aus:

/media
   /1
     i1.jpg
     i2.jpg
     ....

/static
    /css
       /op.css
    /img
       /emoji.png

/Recognition
    ...
    /settings.py
    /urls.py
    ...

/uploader
    ...
    /urls.py
    /templates
         /uploader
             /create.html
    ...

Meine settings.py sieht folgendermaßen aus:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Recognition',
    'uploader',
]

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Mein (Recognition / urls.py) sieht folgendermaßen aus:

urlpatterns = [
    path('admin/', admin.site.urls),
    ...
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Dann greife ich wie folgt auf alle statischen Dateien und Mediendateien in der Vorlage (create.html) zu: Hier ist ein Beispielcode

<!DOCTYPE html>
<html>
<head>
   {% block extrahead %}
      <link rel="stylesheet" type="text/css" href="static/css/op.css">
   {% endblock %}
</head>

<style type="text/css">
.notfound .notfound-404 {
  ...
  background-image: url('static/img/emoji.png');
  ...
}
<style>

<body>
  <img src="{{ MEDIA_ROOT }}/media/i1.jpg" class="image_responsive" height="100px" width="100px">
</body>

ODER

Mit diesem Befehl django können Sie sehen, wo django Ihre statischen Dateien sieht. QUELLE

python manage.py collectstatic --help
Harshit Mahajan
quelle
0

Für mich mache ich nichts anderes als manage.py runserver myip: port auszuführen. Dann schalte ich es aus und starte uwsgi neu, die statischen Dateien werden erfolgreich geladen. Ich weiß nicht warum, aber es funktioniert bei mir ...

li Vektor
quelle
0

in meinem Fall sind meine statischen Dateien in resources/staticVerzeichnis und ich setze einige Einstellungen wie Schlag in settings.pyDatei:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, './resources/static/'),
)

und verwenden Sie es in meiner Vorlage wie folgt:

% load static %}
    <link rel="stylesheet" type="text/css" href="{% static '/plugins/bootstrap/css/bootstrap.css' %}">

Dieser Weg hat bei mir funktioniert.

ahmad_mhm
quelle