2012-04-18 17 views
12

Jestem nowicjuszem Django pracującym przy moim pierwszym projekcie i mającym problem z plikami statycznymi.Pliki statyczne Django nie ładują się

Stworzyłem prosty system autoryzacji, używając django.contrib.auth składający się z dwóch szablonów: mysite/templates/index.html i mysite/templates/registration/login.html. Mam globalną statyczną zawartość w mysite/static, którą chcę mieć dostęp do wszystkich szablonów renderowanych przez wszystkie aplikacje.

mysite/templates/index.html zawiera <img src="{{ STATIC_URL }}pics03.jpg"/> który renderuje jako "static/pics03.jpg" i ładunki w porządku, kiedy odwiedzam adres URL localhost:8000/

mysite/templates/registration/login.html zawiera <img src="{{ STATIC_URL }}pics03.jpg"/> co również świadczy jak "static/pics03.jpg" i nie ładuje się, kiedy odwiedzam adres URL "localhost:8000/accounts/login/"

W moim adresy URL. py Mam:

urlpatterns = patterns('', 
    url(r'^$', 'mysite.views.home'), # plays index.html template 
    url(r'^accounts/login/$', 'django.contrib.auth.views.login'), 

W moim settings.py mam:

PROJECT_DIR = os.path.dirname(__file__) 

STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
    os.path.join(PROJECT_DIR,'static'), 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
) 

STATIC_URL = '/static/' 

STATIC_ROOT = '' 

Byłem pod wrażeniem, że Django należy szukać w globalnej zawartości statycznej STATICFILES_DIRS, ale nie znaleźliśmy statyczną treść login.html nawet jeśli zmienię adres URL w tam bezwzględną ścieżkę do folder statyczny. Czy ktoś może rzucić jakieś światło na ten temat?

Odpowiedz

18

Twoim problemem jest to, że nie jest z ciebie słuchać URL „/ static /” nigdzie w urls.py

Jeśli służyć swoją aplikację za pośrednictwem serwera WWW Apache lub nginx jak to jest normalne, gdy serwer WWW będzie obsługiwać same pliki statyczne.

Dla rozwoju Django pochodzi z wbudowanym serwerem statycznym

do urls.py, na samym końcu dodać

from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
urlpatterns += staticfiles_urlpatterns() 

Co to jest dodanie/statyczne/url i niech cię służyć tym bez serwera WWW.

Jest to odpowiednik

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

niektórzy ludzie powiedzą, że trzeba owinąć URL zasady w „jeżeli settings.DEBUG” używać tylko do dev zasady, ale to existing potrzebne w wszystko i uważam, że to zła rada.

+0

tak, to był problem .. dzięki! – JimJay

+0

Cóż, właściwie w tym drugim przypadku konieczne jest zawinięcie tej reguły. Jeśli spojrzysz na kod Django, zobaczysz, że widok nie sprawdza żadnej opcji DEBUG. –

+2

Widok nigdy nie jest trafiony, ponieważ serwer internetowy jest skonfigurowany tak, aby przechwytywać te i wyświetlać pliki statyczne, więc nie trzeba sprawdzać. – krs

1

Masz problemy z używaniem kompilacji w runserver lub z serwerem Apache lub podobnym? Trochę się z tym zmagałem. Dokumentacja, którą obserwuję, to: https://docs.djangoproject.com/en/dev/howto/static-files/

Druga część jest kluczowa, kiedy jesteś gotowy do wdrożenia. Musisz zdefiniować statyczny katalog główny (który będzie pusty od początku) i uruchomić polecenie manage.py collectstatic, aby przenieść pliki statyczne z całego projektu do tego folderu. Wtedy możesz im służyć.

+0

Po prostu używam runserver obecnie, nie jestem gotowy do wdrożenia – JimJay

0

Czy zmiana STATIC_ROOT='' na STATIC_ROOT='/' pomaga?

Wydaje mi się, że jedyną różnicą jest to, że static/pics03.jpg (ścieżka względna) istnieje na stronie głównej, ale nie z drugiej strony.

Ścieżka bezwzględna /static/pics03.jpg istnieje w obu przypadkach. Jeśli zmiana STATIC_ROOT nie pomoże, po prostu dodaj adres / na początku adresów URL.

Powiązane problemy