2016-08-24 5 views
0

Ich arbeite mit einer bestehenden (und zuvor funktionierenden) Django-Site. Wir haben kürzlich von Django 1.8.13 auf 1.10 aufgerüstet und unsere WSGI ist Gunicorn. Es funktioniert gut, wenn sie von meiner Entwicklung Maschine gehostet wird, aber wenn im Einsatz, alle statischen Ressourcen (auf dem Server-Betreiber und die Haupt-Website) ergeben 404 ist mit der Meldung, Directory indexes are not allowed here.Django liefert keine statischen Dateien

Unsere settings.py enthält folgende Komponenten:

INSTALLED_APPS = (
    ... 
    'django.contrib.staticfiles', 
    ... 
) 

DEBUG = True 
STATIC_URL = '/static/' 
PROJECT_DIR = os.path.dirname(os.path.dirname(__file__)) 
STATICFILES_DIRS = (
    os.path.join(PROJECT_DIR, 'static'), 
) 
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static_resources') 

die Verzeichnisstruktur sieht wie folgt aus:

/my-project-name 
    /my-project-name 
     server.py 
     settings.py 
     urls.py 
     wsgi.py 
    ... 
    /static 
    /static_resources 
    manage.py 
+0

Welchen WSGI verwenden Sie? – Windsooon

+0

Wir verwenden Gunicorn –

+0

Gunicorn wird nicht statische Dateien für Sie behandeln, haben Sie auch nginx für statische Dateien verwendet? – Windsooon

Antwort

0

Die Antwort war sehr subtil. Wenn ich Django 1.9 aktualisiert und lief auf den Server, gab es die folgende Warnung:

?: (urls.W001) Your URL pattern '^static/(?P<path>.*)$' uses include with a regex ending with a '$'. Remove the dollar from the regex to avoid problems including URLs.

In urls.py, meine urlpatterns Liste enthalten:

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

habe ich es zu:

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

Dies löste die Warnung, führte jedoch dazu, dass statische Ressourcen nicht mehr geladen wurden. Es mußte sein:

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

Es ist immer noch ein Rätsel für mich, warum diese auf meiner dev Maschine gearbeitet (ein Macbook), sowie ein weitere auf dem Dev-Maschine-Team (ein Windows-Laptop), aber nicht auf unserem Linux-Server. Aber es funktioniert jetzt, also bin ich fertig damit, es herauszufinden.

0

Try os.path.join (project_dir, '../static') zu ändern, um zu os.path.join (project_dir, 'statische') und STATIC_ROOT = os. path.join (PROJECT_DIR, '../static_resources') zu STATI C_ROOT = os.path.join (PROJECT_DIR, 'statische_resources'). Es wird dein Problem lösen.

+0

Das löst es nicht, weil keiner von denen echte Verzeichnisse in unserer Projektstruktur wäre. –

+0

Nur um sicher zu gehen, habe ich PROJECT_DIR so geändert, dass es auf den äußeren Projektordner anstelle des settings.py Ordners zeigt (was zu mehr macht Sinn) und entfernte die "../"'s. Immer noch nichts. –

1

Django liefert keine statischen Dateien im Produktionsmodus (DEBUG = False). Bei einer Produktionsbereitstellung ist dies die Aufgabe des Webservers. So lösen Sie das Problem:

  • Lauf python manage.py collectstatic
  • in Ihrem Web-Server-Konfigurationspunkt der /static Ordner in den statischen Ordner von Django

Sie nicht nur drehen DEBUG auf, wäre es gefährlich sein!

+0

Dies ist in einer Entwicklungsumgebung, und wir haben 'DEBUG = True'. Ich füge das dem Code in der ursprünglichen Frage hinzu. –

+0

Um dies zu verdeutlichen, stellen wir von der Dev-Maschine einen Server bereit, aber es ist ein Server, der zum Testen vorgesehen ist, so dass es immer noch sicher ist, 'DEBUG = True' zu ​​verwenden –

Verwandte Themen