Jaki jest sens kolekcji Django?

86

To jest prawdopodobnie głupie pytanie, ale po prostu nie klika mi w głowie.

W Django konwencja polega na umieszczeniu wszystkich plików statycznych (np. Css, js) specyficznych dla twojej aplikacji w folderze o nazwie static . Struktura wyglądałaby więc tak:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

W mysite/settings.pymam:

STATIC_ROOT = 'staticfiles'

Więc kiedy uruchamiam polecenie:

python manage.py collectstatic   

Tworzy folder o nazwie staticfilesna poziomie głównym (taki sam katalog jak myapp/)

Jaki to ma sens? Czy nie jest to po prostu tworzenie kopii wszystkich moich plików statycznych?

Chris Tang
źródło

Odpowiedzi:

69

Zbierz pliki statyczne z wielu aplikacji do jednej ścieżki

Cóż, jeden Django projekt może korzystać z kilku aplikacji , więc podczas gdy masz tylko jeden myapp, to może faktycznie być myapp1, myapp2itp

Kopiując je z poszczególnych aplikacji do jednego folderu, możesz wskazać serwerowi frontendu (np. Nginx) ten pojedynczy folder STATIC_ROOTi udostępniać pliki statyczne z jednej lokalizacji, zamiast konfigurować serwer sieciowy do obsługi plików statycznych z wielu ścieżek .

Trwałe adresy URL z ManifestStaticFilesStorage

Uwaga na temat dodawania skrótu MD5 do nazwy pliku w celu przechowywania wersji: Nie jest to część domyślnego zachowania programu collectstatic, settings.STATICFILES_STORAGEdomyślnie StaticFilesStorage(co tego nie robi)

Skrót MD5 zacznie działać, np. Jeśli ustawisz go na używanie ManifestStaticFilesStorage, które reklamy to zachowanie.

Celem tego przechowywania jest dalsze udostępnianie starych plików na wypadek, gdyby niektóre strony nadal odwoływały się do tych plików, np. Ponieważ są one buforowane przez Ciebie lub serwer proxy innej firmy. Ponadto jest to bardzo przydatne, jeśli chcesz zastosować nagłówki Expires z dalekiej przyszłości do wdrożonych plików, aby przyspieszyć czas ładowania przy kolejnych wizytach na stronie.

bakkal
źródło
2
chcesz powiedzieć, że łatwo będzie znaleźć serwer WWW obsługujący statyczną zawartość
babygame0ver
44

Pliki statyczne Django mogą znajdować się w wielu miejscach. Plik obsługiwany tak, jakby /static/img/icon.pngmógł pochodzić z wielu miejsc . Domyślnie:

  • FileSystemFinderbędzie szukać img/icon.pngw każdym STATICFILES_DIRS,
  • AppDirectoriesFinderbędzie szukać img/icon.pngw staticpodfolderze w każdym z twoich plików INSTALLED_APPS. Dzięki temu biblioteki, takie jak Django Admin, mogą dodawać własne pliki statyczne do aplikacji.

Teraz: działa to tylko wtedy, gdy uruchomisz manage.py runserverDEBUG = 1. Po uruchomieniu proces Django nie będzie już obsługiwał statycznych zasobów. Używanie Django do ich obsługi byłoby nieefektywne, istnieją bardziej wyspecjalizowane narzędzia przeznaczone specjalnie do tego.

Zamiast tego powinieneś zrobić coś takiego:

  • znajdź wszystkie pliki statyczne z każdej aplikacji
  • zbudować jeden katalog zawierający je wszystkie
  • prześlij je gdzieś ( statickatalog gdzieś na swoim serwerze internetowym lub w magazynie plików innej firmy)
  • skonfiguruj swój serwer WWW (taki jak nginx), aby obsługiwał /static/*bezpośrednio z tego katalogu i przekierowywał wszelkie inne żądania do Django.

collectstatic to gotowy skrypt, który przygotowuje ten katalog dla Ciebie, tak abyś mógł połączyć go bezpośrednio ze swoim skryptem wdrożeniowym.

Kos
źródło
25

W instalacji produkcyjnej chcesz mieć trwałe adresy URL. Adres URL nie zmienia się, chyba że zmieni się zawartość pliku.

Ma to na celu zapobieganie sytuacji, w której klienci mają na swoim komputerze niewłaściwą wersję pliku CSS lub JS podczas otwierania strony internetowej z Django. Django staticfiles wykrywa zmiany plików i odpowiednio aktualizuje adresy URL, dzięki czemu w przypadku zmiany pliku CSS lub JS przeglądarka internetowa pobiera nową wersję.

Zwykle osiąga się to poprzez dodanie skrótu MD5 do nazwy pliku podczas collectstaticuruchamiania.

Edycja: zobacz także powiązaną odpowiedź dla wielu aplikacji.

Mikko Ohtamaa
źródło
1
Dobry! nie wiedziałem tego
doniyor
„zwykle osiągane przez dodanie skrótu MD5”, masz na myśli ManifestStaticFilesStorage ? Fajnie, nie widziałem tego
Kos
3
Myślę, że domyślnie nie ma haszowania MD5, ponieważ settings.STATICFILES_STORAGEdomyślnie jest StaticFilesStoragetak, więc MD5 włączy się dopiero po tym, jak np. Ustawisz go na ManifestStaticFilesStorage, czy mam rację?
bakkal
@MikkoOhtamaa Ale w takim razie skąd aplikacja frontendowa wie, do której nazwy pliku powinna się łączyć, skoro ta druga zawsze się zmienia?
Lapin
@lapin Dobre pytanie! Oczywiście musi istnieć 1) mapowanie do najnowszych wersji i 2) sposób przekazania tego. Zwykle jest przechowywany gdzieś w pliku, a kiedy pytasz „który pełny adres URL najnowszej wersji X”, podaje wynik.
Mikko Ohtamaa
9

Jest to przydatne, gdy w witrynie jest wiele aplikacji django.

collectstatic zbierze wówczas pliki statyczne ze wszystkich aplikacji w jednym miejscu - tak, aby można je było udostępnić w środowisku produkcyjnym.

aa333
źródło