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.

Comments