Django
Jang-oh - the 'D' is silent

26 stycznia 2016 21:00
Paweł Kucmus
Django (nawet w podstawie) to obszerny temat dlatego rozbijamy jego poznawanie na cztery zajęcia składające się kolejno z:
- Wprowadzenia do Django,
- Django i bazy danych,
- Request to response z Django - Widoki,
- Dane użytkownika w Django - formularze.
Wprowadzenie
Django to wysoko-poziomowy "Web framework" (nie potrafię tego przetłumaczyć). Framework definiuję strukturę aplikacji i zasady jej działania. Mamy wiele Pythonowych frameworków, a Django jest jednym z bardziej rozbudowanych. Obsługuje żądania i odpowiedzi HTTP, komunikację z bazą danych, cache'owanie, szablonowanie, autentykację i wiele innych. Jest raczej ociężałe w porównaniu z innymi jednak warto poznać Django. Dla tych, którzy mogą mieć porównanie z innymi, nie tylko Python'owymi framework'ami https://docs.djangoproject.com/en/1.9/intro/overview/
Od żądania po odpowiedź
Generalnie tworząc aplikację webową liczą się dla nas tylko żądania, na ich podstawie wykonywane akcje i budowane odpowiedzi. W pętli pracuje serwer web oczekujący żądań.
Od teraz na żądania będę nazywał "request'em", a odpowiedź "response'm".
Struktura aplikacji
Django działa podobnie to modelu MVC (Model, View, Controller) gdzie Request trafi do kontrolera, ten decyduje jakie podjąć akcje np. na modelach, następnie widok decyduje jak te dane wyświetlić.
W MTV (Model, Template, View) jest podobnie, jednak nie dotykamy tu warstwy kontrolera do Django z grubsza robi to za nas. Request przechodzi przez
URL resolver
, który na podstawie ścieżki określa jaki podjąć widok, w widoku zachodzi większość akcji (np. na modelach) i dane są zwracane np. w postaci wygenerowanej z szablonu (HTML, itp).
Pierwsze użycie Django
startproject
Mając już zainstalowany virtualenvwrapper możemy utworzyć sobie nowe środowisko na potrzeby nowego projektu w Django.
$ cd development $ mkdir pypila-django $ cd pypila-django $ mkvirtualenv pypila-django (pypila-django)$ pip install django (pypila-django)$ django-admin startproject pypila
PIP zainstaluje nam najnowszą wersję Django, która udostępni nam komendę django-admin
pozwalającą tworzyć podstawowy szkielet projektu Django. W nowo powstałym katalogu pypila
znajdziecie ważny plik manage.py
, z poziomu którego będziecie sterować waszym projektem.
(pypila-django)$ cd pypila (pypila-django)$ ls -l pypila manage.py ... (pypila-django)$ ls -l pypila ... settings.py ...
Jeszcze głębiej znajdziecie plik settings.py
, który zawiera wszelakie dane konfiguracyjne waszego projektu, np.: gdzie mają być przechowywane pliki statyczne, dane do komunikacji z bazą danych i więcej w miarę jak wasz projekt będzie rósł. Pliki settings.py
są często inne dla różnych środowisk, np. środowisko programisty nie jest mocno obciążone więc może używać bazy sqllite3 ale na produkcji już powinniśmy użyć np. Postgres'a, wszystko to możemy kontrolować z poziomu settings.py
.
startapp
Ok, mamy projekt teraz musimy zbudować aplikację. Czym się różni projekt od aplikacji? Więc, w kontekście Django projektem jest całość dla przykładu Blog PyPiła. Blog ten może składać się z aplikacji: quiz (do zapisów), blog (do treści), annoucements (do ogłoszeń). Stwórzmy pierwszą aplikację - do zarządzania treścią - blog
.
(pypila-django)$ cd development/pypila-django/pypila (pypila-django)$ python manage.py startapp blog
migrate
Temat migracji poruszymy przy modelach - w skrócie są to skrypty Python zawierające instrukcje o tym jak powinna wyglądać/zostać zmieniona nasza baza danych. "Czysta" instalacja Django zawiera zestaw migracji, które muszą zostać wyegzekwowane na naszej bazie danych aby podstawowe funkcje Django (np. Admin Panel) mogły działać.
(pypila-django)$ python manage.py migrate
Powyższa komenda uruchamia wszystkie jeszcze nie wykonane na danej bazie migracje, efektem tej komendy powinna być taka informacja:
Operations to perform: Apply all migrations: admin, contenttypes, auth, sessions Running migrations: Rendering model states... DONE Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying sessions.0001_initial... OK
i nowy plik db.sqlite3
w głównym katalogu naszego projektu. Plik ten zawiera naszą całą bazę danych.
createsuperuser
Za chwilę będziemy chcieli po raz pierwszy zalogować się do panelu administracyjnego Django. Nie mamy jednak w bazie żadnego konta administracyjnego. Wcześniej uruchomione migracje stworzyły nam bazę z tabelami użytkowników, jednak są one puste.
(pypila-django)$ python manage.py createsuperuser Username (leave blank to use 'pkucmus'): Email address: Password: Password (again): Superuser created successfully.
runserver
Ta komenda uruchamia serwer webowy. Jest to słaba - mało wydajna usługa, która doskonale sprawdza się na potrzeby programisty pracującego samemu nad swoim kodem. Nie należy używać tego serwera w środowisku produkcyjnym ani nawet przedprodukcyjnym. Do takich zadań używamy uWSGI lub Gunicorn.
Komenda runserver
przyjmuje bardzo ważny dla nas argument informujący na jakim porcie i adresie ma "wysłuchiwać" żądań HTTP. Dla nas będzie to 0.0.0.0:8000
czyli dostępność poprzez każdy z przypisanych maszynie adresów na porcie 8000
.
(pypila-django)$ python manage.py runserver 0.0.0.0:8000 Performing system checks... System check identified no issues (0 silenced). January 10, 2016 - 13:13:03 Django version 1.9.1, using settings 'pypila.settings' Starting development server at http://127.0.0.1:8000/
(serwer ubijamy klawiszami [ctrl] + [c]
)
help
Resztę poleceń zarządzania (management commands) - jak choćby barzdo ważna test
- znajdziecie używając:
(pypila-django)$ python manage.py help
Pierwszy kontakt z naszą aplikacją
Póki co nasza aplikacja nie potrafi nic poza tym co było wbudowane w Django. Po uruchomieniu naszego serwera (python manage.py runserver 0.0.0.0:8000
) otwieramy przeglądarkę i wpisujemy http://127.0.0.1:8000/
. Powinniście zobaczyć informację o tym, że wszystko działa!
Admin Panel
Wcześniej wspomniany panel administracyjny jest domyślnie dostępny pod ścieżką /admin/
. Przejdźmy więc do http://127.0.0.1:8000/admin/
. Tam możecie użyć danych użytkownika stworzonego wcześniej komendą createsuperuser
aby się zalogować. Zobaczycie panel, który (póki co) zawiera tylko możliwość edycji grup i użytkowników.