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?
źródło
from django.conf import settings
oczywiście nie zapomnij oBASE_DIR
wbudowanej stałej zamiastSITE_ROOT
i to działa.Mogą istnieć tylko dwie rzeczy,
settings.py
któ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_DIRS
na dowolną ścieżkę, w której znajdują się pliki statyczne.źródło
Udostępnianie plików statycznych można osiągnąć na kilka sposobów; oto moje notatki dla siebie:
static/my_app/
katalog domy_app
(zobacz uwagę o przestrzeni nazw poniżej)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.css
do zastąpienia kilku stylów administratora, mam taką konfigurację:# 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 wdrażania uruchamiam
collectstatic
i obsługuję pliki statyczne za pomocą nginx.Dokumenty, które wyjaśniły mi całe zamieszanie:
źródło
Jeśli statyczny adres URL jest poprawny, ale nadal:
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()
źródło
STATIC_ROOT
linięstatic
folder 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_DIRS
iSTATIC_ROOT
nie powinno zawierać tego samego katalogu.Wiem, że minęło dużo czasu, ale mam nadzieję, że nowi kumple mogą uzyskać z tego pomoc
źródło
Innym błędem może być brak Twojej aplikacji na liście, na
INSTALLED_APPS
przykł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.
źródło
Rozwiązuję ten problem, dodając nazwę mojego projektu w INSTALLED_APPS.
źródło
Okazało się, że przeniosłem moje
DEBUG
ustawienie w ustawieniach lokalnych, aby nadpisać jeFalse
wartością domyślną . Zasadniczo sprawdź, czy ustawienie DEBUG jest rzeczywiście fałszywe, jeśli tworzysz zDEBUG
irunserver
.źródło
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.źródło
TEMPLATE_DIR=os.path.join(BASE_DIR,'templates') STATIC_DIR=os.path.join(BASE_DIR,'static') STATICFILES_DIRS=[STATIC_DIR]
źródło
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"),)
źródło
Jeśli dodałeś
django-storages
moduł (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 zsettings.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.
źródło
STATICFILES_DIRS
jest stosowany w rozwoju orazSTATIC_ROOT
w produkcji ,STATICFILES_DIRS
iSTATIC_ROOT
nie 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/'), ]
źródło
{'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
źródło