Filozofie projektowe

Ten dokument wyjaśnia podstawowe filozofie, którymi kierowali się deweloperzy Django podczas tworzenia frameworku. Celem jest wytłumaczenie przeszłości i pokierowanie przyszłością.

Ogółem

Luźne powiązanie

Fundamentalną zasadą stosu Django jest loose coupling and tight cohesion. Różnorodne warstwy frameworka nie powinny wiedzieć o innych więcej niż to absolutnie konieczne.

For example, the template system knows nothing about web requests, the database layer knows nothing about data display and the view system doesn’t care which template system a programmer uses.

Jednakże Django przychodzi z pełnym zestawem dla wygody, a części zestawu są ze sobą niezależne gdzie tylko to możliwe.

Mniej kodu

Aplikacje Django powinny używać tak mało kodu jak to możliwe. Django powinno w pełni wykorzystywać dynamiczne możliwości Pythona, tak jak w introspekcji.

Szybki rozwój

The point of a web framework in the 21st century is to make the tedious aspects of web development fast. Django should allow for incredibly quick web development.

Nie powtarzaj się (DRY)

Każdy unikalny pomysł i/lub część danych powinny żyć w jednym i tylko jednym miejscu. Redundancja jest zła. Normalizacja jest dobra.

Framework, w granicach rozsądku, powinien domyślić się ile to możliwe z możliwe małej ilości danych.

Zobacz także

«Dyskusja o DRY w Portland Pattern Repository»

Wprost jest lepiej niż nie wprost.

To jest główna zasada Pythona zapisana w PEP 20, i oznacza że Django nie powinno wykonywać zbyt dużo „magii”. Magia nie powinna się zdarzyć bez naprawdę dobrego powodu. Magia jest warta użycia tylko jeśli stworzy ogromną wygodę nieosiągalną w inny sposób i nie zostanie zaimplementowana w sposób, który będzie dezorientował programistów próbujących nauczyć się jak ją wykorzystać.

Spójność

Framework powinien być na spójny na każdym poziomie. Spójność dotyczy każdego poziomu od niskiego (używania stylu programowaniu w Pythonie) aż po wysoki (doświadczenie z używania Django).

Modele

Wprost jest lepiej niż nie wprost.

Pola nie powinny przyjmować pewnych zachowań bazując jedynie na nazwie pola. To wymaga zbyt dużo wiedzy o systemie i jest podatne na błędy. Natomiast, zachowania powinny bazować na kluczowych argumentach i, w niektórych przypadkach na typie pola.

Uwzględnij całą istotną logikę domeny.

Modele powinny hermetyzować każdy aspekt obiektu, zgodnie z wzorcem projektowym Active Record, którego autorem jest Martin Fowler.

To jest powód dla którego dane zarówno reprezentowane przez model i informacje o nim (to jest nazwa czytelna dla człowieka, opcje jak np. domyślne sortowanie itp.) są trzymane w klasie modelu; wszystkie informacje potrzebne do zrozumienia danego modelu powinny być w nim przechowywane.

API baz danych

Podstawowymi celami API baz danych są:

Efektywność SQL

Powinno się wykonywać zapytanie SQL tak rzadko jak to możliwe, dodatkowo powinno się optymalizować zapytania wewnętrznie.

To jest powód dla którego programiści muszą odwołać się do save() wprost, a framework nie robi tego po cichu w tle.

To jest dodatkowy powód dlaczego metody select_related() QuerySet istnieją. Jest to opcjonalne poprawienie wydajności dla częstych przypadków wybierania „każdego powiązanego obiektu”.

Zwięzła, silna składnia.

Interfejs bazy danych API powinien udostępniać bogatą, wyrazistą składnię przy możliwie małych nakładzie kodu. Nie powinien polegać na importowaniu innych modułów lub pomocniczych obiektów.

Połączenia tabel powinny być wykonywane automatycznie, w tle jeśli jest to konieczne.

Każdy obiekt powinien mieć dostęp do każdego obiektu z którym jest w relacji, w danym systemie. Ten dostęp powinien być obustronny.

Możliwość łatwego przełączenia się na surowy SQL, kiedy to konieczne.

API bazy danych powinno zauważać, że jest to skrót a niekoniecznie wszystko. Framework powinien ułatwiać pisanie spersonalizowanego SQL - całych formuł lub tylko własnych klauzuli WHERE jako własne parametry na wywołania API.

Projekt URL

Luźne powiązanie

URLe w aplikacji Django nie powinny być połączone z podstawowym kodem Pythona. Łączenie URLi wraz z nazwami funkcji Pythona nazywa się Złą i Brzydką Rzeczą.

Poza tym, system URL Django powinien pozwalać, by adresy URL tej samej aplikacji były różne w zależności od kontekstu. Na przykład, jedna strona może przechowywać historie w /stories/, a inna może używać /news/.

Nieskończona elastyczność

URLe powinny być elastyczne jak to tylko możliwe. Każdy wyobrażalny URL powinien być dostępny.

Zalecane najlepsze praktyki

Framework powinien pozwalać programiście łatwo (albo nawet łatwiej) tworzyć ładne URLe niż brzydkie.

File extensions in web-page URLs should be avoided.

Przecinki w URLach zasługują na surową karę.

Ostateczne URLe

Technically, foo.com/bar and foo.com/bar/ are two different URLs, and search-engine robots (and some web traffic-analyzing tools) would treat them as separate pages. Django should make an effort to „normalize” URLs so that search-engine robots don’t get confused.

To uzasadnia używanie ustawienia APPEND_SLASH

System szablonów

Oddzielenie logiki od prezentacji

Widzimy, że system szablonów jako narzędzie kontroli prezentacji i prezentacja zorientowana na logikę to jest to. System szablonów nie powinien wspierać funkcjonalności wykraczających poza ten cel.

Porzuć redundancje

Wiele z dynamicznych stron internetowych używa pewnego wspólnego sposobu projektowania - np. nagłówek, stopka, belka nawigacyjna itp. System szablonów Django powinien sprawić łatwym magazynowanie elementów w jednym miejscu, eliminując duplikaty kodu.

To jest filozofia przemawiająca za template inheritance.

Bądź oddzielony od HTML

System szablonów nie powinien być projektowany tylko jako generator kodu HTML. Powinien być równie dobry w generowaniu innych formatów bazujących na tekście lub po prostu zwykłym tekście.

XML nie powinien zostać użyty do języka szablonów.

Użycie silnika XML do prasowania szablonów wprowadza nowy świat błędów ludzkich w edycji szablonów – i stwarza nieakceptowalny poziom narzutu w przetwarzaniu szablonu

Zakładaj kompetencje projektanta

System szablonów nie powinien być zaprojektowany w taki sposób by szablony ładnie wyświetlały się w edytorach WYSIWYG takich jak Dreamweaver. To jest zbyt dużym ograniczeniem i uniemożliwiłoby składni bycie tak ładną jak jest teraz. Django oczekuje od twórców szablonu łatwości edytowania bezpośrednio HTMLa.

Traktuj białe znaki dosłownie

System szablonów nie powinien robić cudów z białymi znakami. Jeśli szablon zawiera biały znak, system powinien potraktować ten znak tak jak traktuje tekst - po prostu go wyświetlić. Każdy biały znak, który nie jest w znaczniku szablonu, powinien być wyświetlony.

Nie wymyślaj języka programowania

Celem jest to, by nie wymyślać języka programowania. Celem jest, by zaoferować na tyle programistyczno-podobnej funkcjonalności, takiej jak branching czy pętle, na ile jest to niezbędne do tworzenia decyzji związanych z prezentacją. Django Template Language (DTL) próbuje uniknąć zaawansowanej logiki.

System szablonów Django rozpoznaje szablony częściej pisane przez projektantów a nie programistów. W związku z tym nie powinien przyjmować wiedzy o Pythonie.

Bezpieczeństwo i ochrona

System szablonów, w oryginale, powinien zabraniać wstawiania złośliwego kodu - takiego jak komendy usuwające rekordy w bazie danych.

To kolejny powód, dla którego system szablonów nie zezwala na standardowy kod w Pythonie.

Rozszerzalność

System szablonów powinien rozpoznawać że zaawansowani twórcy szablonów mogą chcieć rozszerzyć tę technologię.

To jest filozofia stoją za wyspecjalizowanymi tagami szablonów i filtrami.

Widoki

Prostota

Pisanie widoku powinno być tak proste jak pisanie funkcji w Pythonie. Developerzy nie powinni być zmuszeni do tworzenia klasy, kiedy wystarczy tylko funkcja.

Używaj obiektów zapytań

Widoki powinny mieć dostęp do obiektów zapytań - obiektów, które przechowują metadane o obecnym zapytaniu. Obiekt powinien być przekazywany bezpośrednio do funkcji widoku, nie powinna ona musieć korzystać z danych zapytania przez globalną zmienną. To czyni testowanie widoków przez przekazywanie ‚fałszywych’ obiektów zapytań lekkim, łatwym i przyjemnym.

Luźne powiązanie

Dla widoku nie powinno mieć znaczenia jakiego systemu szablonów używa developer - ani czy w ogóle używa jakiegoś systemu szablonów.

Różnice pomiędzy GET a POST

GET i POST są rozłączne; programiści powinni wprost użyć jednego lub drugiego. Framework powinien umożliwiać łatwe rozróżnienie między danymi pochodzącymi z GET lub POST.

Framework pamięci podręcznej

Głównymi celami Django cache framework są:

Mniej kodu

Pamięć podręczna powinna być szybką jak tylko to możliwe. Stąd też, cały kod frameworka otaczający backend pamięci podręcznej powinien być ograniczony do absolutnego minimum, w szczególności w przypadku metody get()

Spójność

API pamięci podręcznej powinno zapewniać spójny interfejs w zróżnicowanych pamięciach podręcznych backendów.

Rozszerzalność

API pamięci podręcznej powinno być rozszerzalne na poziomie aplikacji zależnie od potrzeb developera (dla przykładu, zobacz Cache key transformation).

Back to Top