Prosty projekt w Python/Django od zera.

 In Python, Technicznie

W tym wpisie dowiecie się jak zacząć swoją przygodę z Python/Django od ściągnięcia i skonfigurowania edytora tekstu VS Code poprzez zainstalowania potrzebnych paczek do Pythona do napisania prostej aplikacji z użyciem Django.

Django jest otwartym frameworkiem przeznaczonym do tworzenia aplikacji internetowych, jest on napisany w języku Python.

Technologia Django bazuje na wzorcu MVT (Model-View-Template), który jest wariacją wzorca MVC (Model-View-Controller). Porównując te dwa wzorce widzimy, że warstwa View w MVT działa trochę jak Controller w MVC, czyli wykonuje logikę biznesową oraz łączy szablon z modelem. Warstwa Template zachowuje się jak warstwa View, czyli jest warstwą prezentacyjną dla użytkownika. Na szczęście Model i w jednym i drugim wzorcu pozostaje taki sam. Framework wspomaga w tworzenie szablonów dzięki Django Template Language (DTL). Jest to narzędzie do szybszego i łatwiejszego tworzenia warstwy prezentacyjnej.

Zaletami Django jest czas tworzenia prototypu aplikacji i skalowalność projektu. Natomiast wadą jest trudność dostosowania gotowych rozwiązań pod własne potrzeby. Często zmusza to wprost do napisania całej logiki samodzielnie, co czasami przeradza się w plus. Gotowe rozwiązania narzucają na nas sztywny schemat działania, który czasami ciężko obejść i utrudnia to pracę z tym frameworkiem.

  • Wymagania:
    • Ubuntu 18.04:
  • Założenia wstępne projektu:
    • Przygotowanie Pythona i VS Code
    • Założenie nowego projektu z aplikacją helloworld
    • Napisanie testu jednostkowego
    • Stworzenie strony głównej z napisem hello world

Instalacja Pythona

Nasz projekt będziemy tworzyć z wersją Pythona 3.6 wraz z wykorzystaniem pipenva. Jest on narzędziem, które odpowiada za zarządzanie wirtualnym środowiskiem naszego projektu.

Aby sprawdzić czy mamy odpowiednią wersję Pythona uruchamiamy terminal(skrót Ctrl + Alt + T), w którym wpisujemy polecenie

python3 --version,

Jeżeli pokaże nam się komunikat “Command ‘python’ not found”, należy zainstalować go poleceniem:

sudo apt install python3.6

Kolejnym potrzebnym elementem będzie menadżer pakietów pip, aby sprawdzić czy jest zainstalowany należy wpisać (w przypadku gdy miało się zainstalowaną starszą wersję pythona np. 3.5 należy sprecyzować wersję podczas wykonywania poleceń ‘python3.6’):

python3 -m pip --version

W przypadku komunikatu: “No module named pip”

Należy go zainstalować wpisując w terminalu

sudo apt-get install python3-pip

Pip posłuży nam do instalowania pakietów potrzebnych do dalszej konfiguracji. Po jego zainstalowaniu należy zrestartować komputer.

 

Instalacja VS Code

Visual Studio Code (VS Code) jest to lekki open-sourcowy edytor kodu stworzony przez firmę Microsoft, który działa na Windowsie, Linuksie i Mac OS. VS Code ma wbudowany edytor, Git’a, Intellisense. Na rok 2018 jest to najpopularniejsze narzędzie do wytwarzania oprogramowania według StackOverflow.com

Instalacja Visual Studio Code z poziomu terminala:

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg

sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg

sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'

sudo apt-get update

sudo apt-get install code

Możemy także ściągnąć paczkę prosto ze strony VS Code i zainstalowac za pomocą komendy:

sudo dpkg -i /path/to/vscode.deb

Dodatki do VS code

VS Code jako platforma open-source posiada wiele dodatków stworzonych przez użytkowników jak i firmę Microsoft. Autor programu przygotował wiele dodatków dla wspieranych języków programowania. W VS code przechodzimy do zakładki Extensions (Control+Shift+X) wyszukujemy dodatku Python od Microsoftu i go pobieramy. Z dodatków od użytkowników które pomagają w pisaniu kodu zalecamy zainstalować:

  1. Django Template
  2. Django Snippets

Konfiguracja VS Code

Ścieżka do ustawień File > Preferences > Settings

Istnieją dwa rodzaje ustawień vs code:

  1. UserSettings: Są to ustawienia globalne naszego środowiska
  2. WorkspaceSettings: Są to ustawienia sprecyzowane tylko dla danego projektu i nadpisują UserSettings

Przykładowe ustawienia:

  • Python › Linting: Enabled – Zaznaczyć tę opcję żeby linter działał.
  • Python › Linting: Pep8Enabled – Zaznaczyć tę opcję żeby linter PEP8 działał. Dodajemy go później w projekcie
  • Files: Auto Save – Zaznaczyć tę opcję żeby pliki zapisywały się automatycznie po zmianie w nich.
  • Python › Formatting: Provider – Ustawić autopep8. Ustawiamy jeżeli chcemy automatyczne formatowanie kodu. Autopep8 dodajemy później w projekcie.
  • Editor: Format On Save – Zaznaczamy jeżeli chcemy żeby automatycznie formatowanie wykonywało się podczas wciśnięcia klawiszy (CTRL + S)

Po więcej informacji odsyłamy do dokumentacji

 

Przygotowanie nowego projektu i środowiska pipenv

Tworzymy nowy folder z nazwą naszego projektu korzystając z terminala.

mkdir MyProject

Następnie należy przejść do tego katalogu poleceniem:

cd MyProject

i następnie uruchomić vs code. Po komendzie code należy podać lokalizację jaką ma otworzyć edytor, “.” oznacza aktualny katalog.

code .

Visual Studio Code posiada terminal zintegrowany z naszym systemem, można go uruchomić skrótem (Ctrl + ~)

Kolejnym krokiem będzie instalacja pakietu pipenv.

python3.6 -m pip install pipenv --user

VS code powinien odrazu spiąć go z naszym projektem, jeżeli tego nie zrobił należy nacisnąć kombinację klawiszy (Ctrl + Shift + P) który pokazuje wszystkie polecenia VS Code.  Wpisujemy python select interpreter i wciskamy Enter. i wybieramy interpreter który został stworzony do naszego projektu.

Po skonfigurowaniu środowiska VS code należy aktywować nasz interpreter w terminalu poleceniem:

pipenv shell

Pipenv tworzy dwa pliki Pipfile i Pipfile.lock. W pliku Pipfile zdefiniowane są pakiety które są zainstlowane w wirtualnym środowisku. Można oznaczyć, które z nich są przeznaczone do środowiska developerskiego, a które do środowiska produkcyjnego. W pliku Pipfile.lock zamrażane są wersje zainstalowanych pakietów oraz dodatkowe informacje, dzięki czemu nie musimy martwić się o zgodności wersji, gdybyśmy przenieśli się na inne środowisko lub na inną maszynę. Dodatkowo podczas korzystania z pipenva gdy uruchamiamy powłokę automatycznie ładowane są zmienne środowiskowe z pliku “.env”. Po wiecej informacji odsyłam do dokumentacji pipenva.

 

Pakiety pythona

Po zainstalowaniu pipenva należy zainstalować potrzebne nam paczki.

Wymagane:

Django Framework – Django to wysokopoziomowy framework napisany w języku Python do aplikacji webowych, który zachęca do szybkiego rozwoju i czystego, pragmatycznego projektowania. Zajmuje się wieloma problemami związanymi z tworzeniem stron internetowych, dzięki czemu możesz skoncentrować się na pisaniu aplikacji bez konieczności odkrywania koła na nowo. Jest bezpłatny i open source.

pipenv install django

Pytest-django – dodatkowa biblioteka wspierająca korzystanie z testów za pomocą biblioteki pytest

pytest-django

Dodatkowe:

pylint – jest narzędziem do analizowania kodu w poszukiwaniu błędów składniowych oraz stylistycznych. Dzięki niemu utrzymamy nasz kod w pewnym porządku oparty o pewne standardy oraz własne zdefiniowane konwencje (co nie znaczy, że będzie bardziej zrozumiały).

pipenv install pylint

tworzymy dodatkowo plik konfiguracyjny pylinta poleceniem:

pylint --generate-rcfile > .pylintrc

W tym pliku możemy skonfigurować dodatkowo jak ma się pylint zachowywać, np. czy podkreślać błędy składniowe oraz można zdefiniować własne konwencje dotyczące przestrzegania czystości kodu.

pep8 i autopep8

Pep8 to linter podobny do pylint tyle że służy do sprawdzania czy twój kod przestrzega pewnych konwencji programowania.

pipenv install pep8

Możemy jeszcze doinstalować paczkę autopep8 żeby nam formatował automatycznie kod do konwencji pep8 po zapisie.

pipenv install autopep8

mypy

Służy do sugerowania typów zmiennych. Bardzo przydatna przy większym projekcie, dzięki niej nie musimy zaglądać do ciała metody, by wydedukować jakiego typu parametry ona przyjmuje. Dodatkowo mypy ostrzega nas gdy będziemy próbowali przekazać inny typ niż został zadeklarowany, dzięki czemu szybciej możemy wykryć problemy. Za niewielki nakład pracy otrzymujemy mnóstwo korzyści.

pipenv install mypy

 

Generowanie projektu

Będąc w folderze projektu należy aktywować powłokę pipenva i wpisać w konsoli:

python -m django startproject my_site .

Folder my_site jest to folder z główną konfiguracją strony i powinny znajdować się w nim pliki urls.py, settings.py, wsgi.py. Kropka po nazwie naszego projektu wskazuje skryptowi lokalizację utworzenia nowego projektu.

Projekt w Django dzielimy na mniejsze modułu zwane aplikacjami. Dzięki takiemu podziałowi możemy wymieniać aplikacje pomiędzy projektami. Aplikacje tworzymy za pomocą komendy:

python -m django startapp hello

Po stworzeniu aplikacji, główny projekt jeszcze nie wie o jej istnieniu ani że będzie korzystać z tej aplikacji. Należy więc dodać tą informację w pliku settings.py w INSTALLED_APPS należy podać nazwę tej aplikaji np:

INSTALLED_APPS = [
...
'hello',
]

Po dodaniu aplikacji do głównego projektu, należy zapoznać się z podstawowymi poleceniami, które podczas pracy z Django są niezbędne. Manage.py jest to plik generowany automatycznie przy tworzeniu projektu Django. Służy jako narzędzie linii poleceń do obsługi projektu.

python manage.py <polecenie> [opcje]

Najczęściej używane polecenia manage.py to:

python manage.py makemigrations

Tworzy migracje na podstawie zmian w modelach

python manage.py migrate

Synchronizuje bazę danych z aktualnym stanem migracji

python manage.py runserver

Uruchamia serwer deweloperski na localhoscie na porcie 8000

 

Test Driven Development

Test Driven Development w skrócie TDD jest to technika tworzenia oprogramowania. Zakłada ona napisanie testów przed napisaniem właściwej funkcjonalności. W tej metodologii wyszczególnia się trzy fazy pisania kodu:

  1. Faza Red – Programista pisze test sprawdzający funkcjonalność. Test w tym momencie nie powinien się udać.
  2. Faza Green – Programista implementuje funkcjonalność. W tym momencie wcześniej napisany test powinien się udać.
  3. Faza Refactor – Programista dokonuje refaktoryzacji napisanego kodu, żeby spełniał on oczekiwane standardy.

W tym projekcie do testów będziemy wykorzystywać bibliotekę pytest. Aby skonfigurować pytest z projektem Django w głównym katalogu z projektem tworzymy plik pytest.ini z określeniem gdzie znajdują się główne ustawienia projektu

[pytest]
DJANGO_SETTINGS_MODULE = mysite.settings

Po skonfigurowaniu naszedł czas na pierwszy test. W hello/tests.py

Oto przykładowa implementacja testu, sprawdza czy istnieje nasza strona pod wskazanym adresem url (reverse_lazy(‘index’)). Konfiguracja ścieżki url jest pobierana z pliku urls.py i wybierany poprzez name.

import pytest
from django.urls import reverse_lazy@pytest.mark.django_db
class TestPageHello:

def test_main_page(self, client):
url_main_page = reverse_lazy('index')

response = client.get(url_main_page)

assert response.status_code == 200

Po przygotowaniu środowiska testowego i skonfigurowaniu go można przystąpić do implementacji.

 

Implemenctacja

Według założeń aplikacja będzie wyświetlać Hello World. Oto podstawowy podstawowy szablon html’a który będzie taką funkcję spełniał.

hello/templates/index.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>New Page</title>
</head>
<body>
Hello World
<!--  Dalej możemy wstawić co chcemy -->
</body>
</html>

W plikach html Django daje nam możliwość używania DTL, który został wspomniany we wstępie. Dzięki niemu możemy w łatwy sposób wyświetlać, modyfikować, filtrować dane dostarczane nam przez warstwę View. Podstawowa składnia DTL:

  • tagi blokowe np:
    {% if something %} True {% else %} False {% endif %}
  • zmienne:
    {{ variable }}

hello/views.py:

from django.views.generic import TemplateView

class IndexView(TemplateView):
template_name = 'index.html'

Jako widoku używana będzie klasa, która dziedziczy po generycznym TemplateView. Należy wskazać w zmiennej template_name nazwę pliku z szablonem.

urls.py:

from django.urls import path
from hello.views import IndexViewurlpatterns = [
path('/', IndexView.as_view(), name='index'),
]

Żeby móc wyświetlić nasz widok, należy nadać mu ścieżkę url. Jako, że to nasz podstawowy widok to pierwszym parametrem będzie adres po którym widok będzie wyświetlany, jako drugi klasa widoku z wywołaniem odpowiedniej funkcji która zwraca widok oraz trzeci parametr to nazwa widoku.

Recommended Posts
Showing 2 comments
  • b-ciachurski.pl

    Może pomyślicie o cyklu artykułów w firmie kursu Python?

    • Juliusz Lewalski

      Dzięki za komentarz 🙂
      Niestety nie ma takiego kursu w planach, ale polecam darmowy kurs Obey the Testing Goat. Dowiesz się w nim o podejściu Test Driven Development oraz nauczysz się Django.