Django - nie znaleziono pliku statycznego

80

Widziałem kilka postów dotyczących tego problemu, ale nie znalazłem rozwiązania.

Próbuję obsługiwać pliki statyczne w moim środowisku programistycznym Django 1.3.

Oto moje ustawienia

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

Mój urls.py

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

Mój katalog / home / glide / Documents / django / cbox / static / jest podobny

css
  main.css
javascript
image

Otrzymuję błąd 404 podczas próby uzyskania dostępu do http://127.0.0.1:8000/static/css/main.css .

Czy muszę indywidualnie określać wzorce dla css, javascript i obrazów?

Pierre de LESPINAY
źródło

Odpowiedzi:

110

I mylić STATIC_ROOT i STATICFILES_DIRS

Właściwie tak naprawdę nie rozumiałem użyteczności STATIC_ROOT . Pomyślałem, że to katalog, w którym muszę umieścić moje wspólne pliki. Ten katalog jest używany do produkcji, jest to katalog, w którym będą umieszczane (gromadzone) pliki statyczne przez collectstatic .

STATICFILES_DIRS to ten, którego potrzebuję.

Ponieważ jestem w środowisku programistycznym, rozwiązaniem dla mnie jest nieużywanie STATIC_ROOT (lub określenie innej ścieżki) i ustawienie katalogu wspólnych plików w STATICFILES_DIRS :

#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/'),
)

Nie zapomnij o tym from django.conf import settings

Pierre de LESPINAY
źródło
2
Nie, adres urls.py powinien być taki jak w pytaniu (to samo dla mediów) i from django.conf import settingsoczywiście nie zapomnij o
Pierre de LESPINAY
Chcę tylko dodać do tej odpowiedzi, nie przegap s. powinien to być STATICFILES_DIRS. Zrobiłem STATICFILE_DIRS, oszalałem na 45 minut szukając błędu.
niccolo m.
1
Używam BASE_DIRwbudowanej stałej zamiast SITE_ROOTi to działa.
Maduka Jayalath
33

Mogą istnieć tylko dwie rzeczy, settings.pyktóre powodują problemy.

1) STATIC_URL = '/static/'

2)

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

a Twoje pliki statyczne powinny znajdować się w katalogu statycznym, który znajduje się w tym samym katalogu, co plik ustawień projektu.

Nawet wtedy, gdy twoje pliki statyczne nie ładują się, powodem jest, być może zachowałeś

DEBUG = False

zmień go na True (wyłącznie do celów programistycznych). W produkcji po prostu zmień STATICFILES_DIRSna dowolną ścieżkę, w której znajdują się pliki statyczne.

Naren Yellavula
źródło
2
W moim przypadku to moja zmienna środowiskowa do debugowania była fałszywa. Ustawiłem to na prawdę i teraz działa
Smit Patel
Cześć. Wypróbowałem wszystkie wymienione rozwiązania, ale nadal daje mi to 404. Czy ktoś może mi pomóc?
Mukul_Vashistha,
32

Udostępnianie plików statycznych można osiągnąć na kilka sposobów; oto moje notatki dla siebie:

  • dodaj static/my_app/katalog do my_app(zobacz uwagę o przestrzeni nazw poniżej)
  • zdefiniuj nowy katalog najwyższego poziomu i dodaj go do STATICFILES_DIRS w settings.py (zauważ, że The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting)

Wolę pierwszy sposób i konfigurację, która jest blisko drogi zdefiniowanego w dokumentacji , więc aby udostępnić plik admin-custom.cssdo zastąpienia kilku stylów administratora, mam taką konfigurację:

.
├── 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/'

Jest to następnie używane w szablonie w następujący sposób:

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

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

Podczas programowania, jeśli używasz django.contrib.staticfiles [ed: instalowane domyślnie], zostanie to zrobione automatycznie przez runerver, gdy DEBUG jest ustawiony na True [...]

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

Podczas wdrażania uruchamiam collectstatici obsługuję pliki statyczne za pomocą nginx.


Dokumenty, które wyjaśniły mi całe zamieszanie:

STATIC_ROOT

Bezwzględna ścieżka do katalogu, w którym collectstatic będzie zbierać pliki statyczne do wdrożenia.

... to nie miejsce do przechowywania plików statycznych stałe. Powinieneś to zrobić w katalogach, które zostaną znalezione przez wyszukiwarki plików staticfiles, które domyślnie są podkatalogami aplikacji „static /” i dowolnymi katalogami, które dołączasz do STATICFILES_DIRS).

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


Przestrzenie nazw plików statycznych

Teraz być może uda nam się umieścić nasze pliki statyczne bezpośrednio w my_app / static / (zamiast tworzyć kolejny podkatalog my_app), ale w rzeczywistości byłby to zły pomysł. Django użyje pierwszego znalezionego pliku statycznego, którego nazwa pasuje, i gdybyś miał plik statyczny o tej samej nazwie w innej aplikacji, Django nie byłby w stanie ich rozróżnić. Musimy być w stanie wskazać Django właściwą, a najłatwiejszym sposobem zapewnienia tego jest umieszczenie ich w przestrzeni nazw. Oznacza to, że umieszczając te statyczne pliki w innym katalogu o nazwie odpowiadającej samej aplikacji.

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


STATICFILES_DIRS

Twój projekt prawdopodobnie będzie zawierał również statyczne zasoby, które nie są powiązane z konkretną aplikacją. Oprócz używania katalogu static / wewnątrz aplikacji, możesz zdefiniować listę katalogów (STATICFILES_DIRS) w pliku ustawień, w którym Django będzie również szukał plików statycznych.

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

ptim
źródło
8

Jeśli statyczny adres URL jest poprawny, ale nadal:

Nie znaleziono: /static/css/main.css

Być może twój problem z WSGI.

➡ Config WSGI obsługuje zarówno środowisko programistyczne, jak i środowisko produkcyjne

==========================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
źródło
6
  1. Możesz usunąć STATIC_ROOTlinię
  2. Lub możesz utworzyć inny staticfolder w innym katalogu. Załóżmy, że katalog to: project\static Teraz zaktualizuj:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'project/static/')
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Cokolwiek robisz, głównym celem jest STATICFILES_DIRSi STATIC_ROOTnie powinno zawierać tego samego katalogu.

Wiem, że minęło dużo czasu, ale mam nadzieję, że nowi kumple mogą uzyskać z tego pomoc

yuv
źródło
3

Innym błędem może być brak Twojej aplikacji na liście, na INSTALLED_APPSprzykład:

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

Bez tego możesz napotkać problemy, takie jak niewykrywanie plików statycznych, w zasadzie wszystkich plików związanych z Twoją aplikacją. Nawet jeśli może być poprawne, jak sugeruje poprawna odpowiedź, używając:

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

Może to być jeden z błędów i należy go sprawdzić, jeśli pojawia się ten błąd.

Aklank Jain
źródło
2

Rozwiązuję ten problem, dodając nazwę mojego projektu w INSTALLED_APPS.wprowadź opis obrazu tutaj

Saiful Islam
źródło
to naprawiło to dla mnie, ale myślę, że mogę potrzebować lepszego rozwiązania, każda aplikacja powinna mieć własny folder statyczny w moim przypadku
SeanDp32
1

Okazało się, że przeniosłem moje DEBUGustawienie w ustawieniach lokalnych, aby nadpisać je Falsewartością domyślną . Zasadniczo sprawdź, czy ustawienie DEBUG jest rzeczywiście fałszywe, jeśli tworzysz z DEBUGi runserver.

Daniel Butler
źródło
1

W poleceniu typu cmd Poda python manage.py findstatic --verbosity 2 static on katalog, w którym Django szuka plików statycznych.Jeśli utworzyłeś środowisko wirtualne, w tym folderze nazwa_środowiska_wirtualnego będzie znajdował się folder statyczny. VIRTUAL_ENVIRONMENT_NAME\Lib\site-packages\django\contrib\admin\static. Po uruchomieniu powyższego polecenia „findstatic”, jeśli Django pokazuje tę ścieżkę, po prostu wklej wszystkie pliki statyczne do tego katalogu statycznego. W pliku html użyj składni JINJA dla href i sprawdź inne wbudowane css. Jeśli po przekazaniu składni JINJA nadal istnieje źródło obrazu lub adres URL, należy go poprzedzić znakiem „/ static”. To zadziałało dla mnie.

Aansh Savla
źródło
1
TEMPLATE_DIR=os.path.join(BASE_DIR,'templates')
STATIC_DIR=os.path.join(BASE_DIR,'static')

STATICFILES_DIRS=[STATIC_DIR]
Mumin
źródło
1

W twoim settings.py mogą znajdować się następujące rzeczy:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': ["templates"],

'APP_DIRS': True,

'OPTIONS': {
# ... tutaj niektóre opcje .. .
},
},]

LUB

STATIC_URL = „/ static /”

LUB

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

Rahul Verma
źródło
0

Jeśli dodałeś django-storagesmoduł (na przykład w celu obsługi przesyłania plików do S3 w twojej aplikacji django) i jeśli tak jak ja nie przeczytałeś poprawnie dokumentacji tego modułu , po prostu usuń ten wiersz z settings.py:

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

W przeciwnym razie spowoduje to, że Twoje statyczne zasoby nie będą widoczne na komputerze lokalnym, ale zdalnie w wiadrze S3, w tym w panelu administracyjnym CSS, a tym samym skutecznie łamią CSS panelu administracyjnego.

Overdrivr
źródło
0

STATICFILES_DIRS jest stosowany w rozwoju oraz STATIC_ROOTw produkcji ,

STATICFILES_DIRS i STATIC_ROOTnie powinien mieć tej samej nazwy folderu,

Jeśli potrzebujesz dokładnie tego samego folderu statycznego w programowaniu i produkcji, wypróbuj tę metodę

uwzględnij to w 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
źródło
-1

{'document_root', settings.STATIC_ROOT} musi być {'document_root': settings.STATIC_ROOT}

lub pojawi się błąd taki jak dictionary update sequence element #0 has length 6; 2 is required

Jens Timmerman
źródło