Jestem zdezorientowany static root
i chcę wszystko wyjaśnić.
Aby udostępniać pliki statyczne w Django, w settings.py
and urls.py
:
import os
PROJECT_DIR=os.path.dirname(__file__)
1. Bezwzględna ścieżka do katalogu, w którym powinny być gromadzone pliki statyczne
STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')
2. Prefiks adresu URL dla plików statycznych
STATIC_URL = '/static/'
3. Dodatkowe lokalizacje dla plików statycznych
STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)
... i w urls.py
następujących wierszach:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
r'^static/(?P<path>.*)$',
'django.views.static.serve',
{'document_root': settings.STATIC_ROOT}
))
4. Używamy również python manage.py collectstatic
Pytania:
Czy ktoś mógłby mi wyjaśnić przebieg pracy: jak najlepiej to zrobić. Na razie kopiuję / wklejam powyższe fragmenty kodu do wyznaczonych lokalizacji i kontynuuję tworzenie nowych plików w katalogu statycznym i działa. W moim
settings.STATIC_ROOT
jednak wskazałem na inny katalog.Byłoby wspaniale, gdyby ktoś mógł wyjaśnić przepływ pracy dla każdego ustawienia: w jaki sposób pliki są gromadzone i zarządzane oraz jakie dobre praktyki należy stosować.
Dzięki.
django
django-urls
django-staticfiles
user993563
źródło
źródło
if settings.DEBUG:
django nie jest zbyt dobre w obsłudze mediów statycznych, powinno to być pozostawione prawdziwemu serwerowi WWW.Odpowiedzi:
STATIC_ROOT
teraz polecenie
./manage.py collectstatic
skopiuje wszystkie pliki statyczne (tj. w folderze statycznym w twoich aplikacjach, pliki statyczne we wszystkich ścieżkach) do katalogu/var/www/example.com/static/
. teraz musisz tylko udostępniać ten katalog na Apache lub nginx..etc.STATIC_URL
Jeśli ustawisz
STATIC_URL = 'http://static.example.com/'
, musisz udostępniaćSTATIC_ROOT
folder (tj."/var/www/example.com/static/"
) Przez apache lub nginx pod adresem url'http://static.example.com/'
(abyś mógł skierować plik statyczny za'/var/www/example.com/static/jquery.js'
pomocą'http://static.example.com/jquery.js'
)Teraz w swoich szablonach django możesz polecić to przez:
który wyrenderuje:
źródło
{{ STATIC_URL }}jquery.js
i{% static "jquery.js" %}
są takie same. tj. oba powrócą/static/jquery.js
. Nowsze wersje django są zalecane do używania{% static "jquery.js" %}
, ale musisz załadować szablon templatetag, tj{% load staticfiles %}
. w starszej wersji django poleca{{STATIC_URL}}
static
metodę zamiastSTATIC_URL
metody i błąd zniknął. Dobre wezwanie do sugestii opartych na wersjach.STATICFILES_DIRS
: Możesz zachować statyczne pliki swojego projektu tutaj, np. Te używane przez twoje szablony.STATIC_ROOT
: zostaw to puste, gdy to zrobiszmanage.py collectstatic
, wyszuka wszystkie pliki statyczne w twoim systemie i przeniesie je tutaj. Twój serwer plików statycznych powinien być mapowany na ten folder, gdziekolwiek się znajduje. Sprawdź to po uruchomieniu collectstatic, a znajdziesz strukturę katalogów zbudowaną przez django.--------Edytować----------------
Jak wskazał @DarkCygnus, STATIC_ROOT powinien wskazywać katalog w twoim systemie plików, folder powinien być pusty, ponieważ zostanie zapełniony przez Django.
lub
-------- Zakończ edycję -----------------
STATIC_URL
: „/ static /” jest zwykle w porządku, to tylko przedrostek dla plików statycznych.źródło
STATICFILES_DIRS
powinny służyć jako dodatkowe katalogi dla plików statycznych.Jeśli umieścisz wszystkie swoje css / js / images w folderze APP_NAME / static / APP_NAME, nie ma potrzeby określaniaSTATICFILES_DIRS
.settings.py
(robiącSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
) przed uruchomieniem polecenia collectstatic .Wszystkie powyższe odpowiedzi są pomocne, ale żadna nie rozwiązała mojego problemu. W moim pliku produkcyjnym mój STATIC_URL był
https://<URL>/static
i użyłem tego samego STATIC_URL w moim pliku dev settings.py.Powoduje to cichą awarię w django / conf / urls / static.py.
Test
elif not settings.DEBUG or '://' in prefix:
wykrywa „//” w adresie URL i nie dodaje statycznego wzorca adresu URL, przez co nie można znaleźć żadnych plików statycznych.Byłoby dobrze, gdyby Django wypluł komunikat o błędzie informujący, że nie można użyć
http(s)://
withDEBUG = True
Musiałem zmienić STATIC_URL na „/ static /”
źródło