Aplikacja internetowa

Aplikacja internetowa to określenie programów, które pracują w architekturze klient‑serwerklient‑serwerklient‑serwer.

Po stronie serwera umieszcza się m.in. obsługę operacji wykonywanych na bazie danych czy operacji obliczeniowych, czyli całego kodu aplikacji, który nie jest bezpośrednio dostępny dla użytkownika. Ta część to back‑endback‑endback‑end.

Natomiast po stronie klienta znajduje się front‑endfront‑endfront‑end, tj. końcowy efekt działania aplikacji w postaci strony WWW, która jest wyświetlana w przeglądarce. Strony tworzą graficzny interfejs końcowego użytkownika.

Schemat działania aplikacji internetowej polega na tym, że użytkownik z użyciem przeglądarki i protokołu HTTP(S) wysyła żądania do serwera, np. wpisuje adres URL w przeglądarce, aby otrzymać listę dań lub klientów. Oprogramowanie po stronie serwera odbiera i przetwarza żądanie, w tym:

  • na podstawie adresu URL rozpoznaje, czy żądanie może być obsłużone,

  • jeżeli potrzeba, dokonuje uwierzytelnienia i autoryzacji użytkownika,

  • wywołuje funkcje przetwarzające żądanie,

  • wykonuje wymagane operacje na bazie, np. odczytuje dane z tabel,

  • zwraca odpowiedź do klienta, np. wysyła kod strony WWW zawierającej dane z bazy.

Przygotowywanie tego typu aplikacji jest czynnością złożoną i realizowaną zazwyczaj przez zespół wyspecjalizowanych programistów. My zaś skupimy się na back-endzie, tj. wykonywaniu wybranych operacji na przygotowanej bazie SQLite z wykorzystaniem frameworku języka Python o nazwie Flask oraz języka SQL.

Dla zainteresowanych

W wielu profesjonalnych rozwiązaniach operacji na bazie nie wykonuje się za pomocą instrukcji języka SQL, lecz z wykorzystaniem systemów ORM (ang. Object‑Relational Mapping – mapowanie obiektowo‑relacyjne), takich jak np. SQLAlchemy. Jak wskazuje nazwa, tabele bazy danych traktowane są wtedy jako mające właściwości obiekty, na których wykonywać można określone operacje.

W przypadku front‑endu ograniczymy się do formularzy HTML i minimalnej ilości kodu CSS, aby przygotować strony, które pozwolą wykonywać cztery podstawowe operacje na bazie danych opisywane skrótem CRUD (ang. create, read, update, delete), tj. tworzenie, odczytywanie, modyfikowanie i usuwanie danych.

Aplikacje internetowe tworzone w oparciu o jakiś framework wymagają pakietów w określonej wersji, mają modułową budowę i zawierają wiele zasobów umieszczonych w katalogach o określonej strukturze. Dlatego podczas ich tworzenia korzysta się zazwyczaj z rozbudowanych środowisk IDE i wirtualnych środowisk uruchomieniowych.

Środowisko programistyczne PyCharm i podstawy jego obsługi przedstawione zostały w multimedium. Dalsze kroki nie zakładają jego wykorzystania, ale jest to zalecane ze względu na wielorakie ułatwienia w pisaniu kodu, m.in. wskazywanie błędów.

Katalog aplikacji

Poniżej znajdziesz archiwum zawierające katalog aplikacji.

RcRj9fhiBG5Ce

Plik z archiwum zip.

Archiwum restauracja.zip
Plik ZIP o rozmiarze 2.73 KB w języku polskim

Pobieramy załączone archiwum restauracja.zip. W systemie Linux archiwum rozpakowujemy w katalogu domowym użytkownika, a w systemie Windows najlepiej w katalogu głównym wybranej partycji, np. oznaczonej literą D:.

Archiwum zawiera katalog o przykładowej nazwie restauracja – od tej pory będziemy nazywali go katalogiem aplikacji. Katalog zawiera plik restauracja.sql, w którym umieściliśmy instrukcje tworzące tabele omówione w poprzednim materiale z serii. Poza tym w katalogu znajdziemy podkatalogi statictemplates zawierające pliki potrzebne do budowania stron WWW oraz gotowy kod bazy danych.

W katalogu aplikacji uruchamiamy systemowy wiersz poleceń. W systemach Linux może to być terminal z domyślną powłoką systemową bash. Wpisujemy i wykonujemy kolejno podane niżej komendy:

Linia 1. tylda prawy ukośnik restauracja$ python3 minus m venv venv. Linia 2. tylda prawy ukośnik restauracja$ source venv prawy ukośnik bin prawy ukośnik activate. Linia 3. otwórz nawias okrągły venv zamknij nawias okrągły tylda prawy ukośnik restauracja$ pip install flask znak równości znak równości 2 kropka 3 kropka 2.

W systemie MS Windows uruchamiamy interpreter poleceń PowerShell, wpisujemy i wykonujemy kolejno polecenia:

Linia 1. D dwukropek lewy ukośnik restauracja zamknij nawias ostrokątny python minus m venv venv. Linia 2. D dwukropek lewy ukośnik restauracja zamknij nawias ostrokątny venv lewy ukośnik Scripts lewy ukośnik Activate kropka ps1. Linia 3. otwórz nawias okrągły venv zamknij nawias okrągły D dwukropek lewy ukośnik restauracja zamknij nawias ostrokątny pip install flask znak równości znak równości 2 kropka 3 kropka 2.

Powłoka systemowa bash lub interpreter PowerShell umożliwiają komunikowanie się użytkownika z systemem i wykonywanie różnych operacji za pomocą wpisywanych poleceń oraz uruchamiania skryptów. W powłoce / interpreterze mogą być również wyprowadzane wyniki działania programów.

W systemach Linux znak ~ (tylda) oznacza katalog domowy zalogowanego użytkownika, a separatorem katalogów i plików w ścieżce dostępu jest ukośnik.

W systemie MS Windows separatorem katalogów i plików jest ukośnik wsteczny (ang. backslash).

Ważne!

W systemie musimy mieć zainstalowany interpreter języka Python 3 w wersji min. 3.10 dostępny w wierszu poleceń, aby podane wyżej komendy zostały poprawnie wykonane.

Pierwsze polecenie python3 -m venv venv w podkatalogu o nazwie venv tworzy wirtualne środowisko zawierające minimalny zestaw bibliotek języka Python. Polecenie wydajemy raz na początku pracy z aplikacją lub w przypadku usunięcia poprzedniego środowiska.

By móc instalować dowolne biblioteki, a także rozwijać i uruchamiać aplikację niezależnie od systemowej instalacji języka Python, utworzone środowisko trzeba aktywować, wydając drugie polecenie, np. source venv/bin/activate.

Ważne!

Aktywacja środowiska musi być wykonana po każdym uruchomieniu systemowego wiersza poleceń w katalogu aplikacji. O poprawnej aktywacji świadczy prefix (venv) dodany do ścieżki katalogu. Po aktywacji nie należy zamykać terminala, ponieważ aplikacja będzie uruchamiana w wierszu poleceń.

Wskazówka

Środowisko programistyczne PyCharm pozwala uniknąć konieczności ręcznego uruchamiania wiersza poleceń, tworzenia i aktywowania środowiska wirtualnego.

Ostatnie polecenie pip install flask==2.3.2 umożliwia zainstalowanie podanej biblioteki, tzn. frameworku Flask w wersji 2.3.2, z której korzystamy w e‑materiałach. Wydajemy je raz po utworzeniu środowiska.

Aplikacja Restauracja

W pliku o nazwie app.py umieszczamy minimum kodu potrzebnego do uruchomienia aplikacji:

Linia 1. from flask import Flask. Linia 3. app znak równości Flask otwórz nawias okrągły podkreślnik podkreślnik name podkreślnik podkreślnik zamknij nawias okrągły. Linia 5. at app kropka route otwórz nawias okrągły apostrof prawy ukośnik apostrof zamknij nawias okrągły. Linia 6. def index otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 7. return apostrof Strona główna apostrof. Linia 9. with app kropka app podkreślnik context otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 10. if podkreślnik podkreślnik name podkreślnik podkreślnik znak równości znak równości cudzysłów podkreślnik podkreślnik main podkreślnik podkreślnik cudzysłów dwukropek. Linia 11. app kropka run otwórz nawias okrągły debug znak równości True zamknij nawias okrągły.

Aplikację uruchamiamy w wierszu poleceń otwartym w katalogu aplikacji z aktywnym środowiskiem wirtualnym za pomocą polecenia flask run --debug.

Inna możliwość to wydanie polecenia python3 app.py (Linux) lub python app.py (MS Windows).

RLGson9kPTN5E
Przykład uruchomienia aplikacji w systemie Linux.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Jak widać na zrzucie ekranu, w trybie deweloperskim aplikacja uruchamia serwer WWW, który używa protokołu http i nasłuchuje żądań na adresie pętli zwrotnej i porcie 127.0.0.1:5000. Kiedy w przeglądarce internetowej wpiszemy podany adres i zatwierdzimy klawiszem ENTER lub klikniemy adres w terminalu z wciśniętym klawiszem CTRL (to powinno spowodować otwarcie przeglądarki), przeglądarka wyśle do serwera żądanie typu GET o zwrócenie zasobu domyślnego z głównego katalogu serwera. Zasób ten dostępny jest pod adresem URL http://127.0.0.1:5000/ – znak prawego ukośnika (ang. slash) na końcu oznacza główny katalog serwera.

Po otrzymaniu żądania aplikacja działająca po stronie serwera sprawdzi wszystkie adresy URL zdefiniowane w dekoratorachdekoratordekoratorach route() i jeżeli znajdzie dopasowanie, wywoła funkcję, która ma adres obsłużyć. W pliku app.py dodaliśmy adres URL „/”, który ma zostać obsłużony przez funkcję index().

Linia 1. at app kropka route otwórz nawias okrągły apostrof prawy ukośnik apostrof zamknij nawias okrągły. Linia 2. def index otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 3. return apostrof Strona główna apostrof.

Adres URL, który podajemy w dekoratorze route(), pozbawiony jest protokołu i adresu serwera (nazwy hosta). Funkcja języka Python, która znajduje się poniżej, nazywana jest widokiemwidokwidokiem (ang. view) i powinna zwracać jakąś wartość. W najprostszym przypadku jest to ciąg znaków, który zostanie odesłany jako odpowiedź do przeglądarki: return 'Strona główna'.

Wynikiem wszystkich opisanych operacji będzie wyświetlenie w przeglądarce tekstu Strona główna.

REVPCOxH7WRSo
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Zamknięcie okna przeglądarki nie zatrzymuje działania serwera. Aby to zrobić, w oknie terminala naciskamy kombinację klawiszy CTRL+C. Podczas rozwijania aplikacji serwer może przestać działać, np. z powodu niedokończonego kodu; wtedy po zakończeniu wprowadzania zmian uruchamiamy aplikację ponownie.

Połączenia z bazą danych

W kolejnym kroku przygotujemy moduł, w którym znajdą się funkcje obsługujące połączenie z bazą danych. W katalogu aplikacji tworzymy nowy plik o nazwie db.py, w którym umieszczamy następujący kod:

Linia 1. import sqlite3. Linia 2. from flask import g przecinek current podkreślnik app. Linia 4. def get podkreślnik db otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 5. cudzysłów cudzysłów cudzysłów Funkcja tworzy połączenie z bazą cudzysłów cudzysłów cudzysłów. Linia 6. if apostrof db apostrof not in g dwukropek. Linia 7. g kropka db znak równości sqlite3 kropka connect otwórz nawias okrągły. Linia 8. current podkreślnik app kropka config otwórz nawias kwadratowy apostrof DATABASE apostrof zamknij nawias kwadratowy przecinek. Linia 9. detect podkreślnik types znak równości sqlite3 kropka PARSE podkreślnik DECLTYPES. Linia 10. zamknij nawias okrągły. Linia 11. g kropka db kropka row podkreślnik factory znak równości sqlite3 kropka Row. Linia 12. return g kropka db. Linia 14. def close podkreślnik db otwórz nawias okrągły e znak równości None zamknij nawias okrągły dwukropek. Linia 15. cudzysłów cudzysłów cudzysłów Funkcja zamyka połączenia z bazą cudzysłów cudzysłów cudzysłów. Linia 16. db znak równości g kropka pop otwórz nawias okrągły apostrof db apostrof przecinek None zamknij nawias okrągły. Linia 17. if db is not None dwukropek. Linia 18. db kropka close otwórz nawias okrągły zamknij nawias okrągły. Linia 20. def init podkreślnik app otwórz nawias okrągły app zamknij nawias okrągły dwukropek. Linia 21. cudzysłów cudzysłów cudzysłów Funkcja rejestruje funkcję close podkreślnik db otwórz nawias okrągły zamknij nawias okrągły w aplikacji cudzysłów cudzysłów cudzysłów. Linia 22. app kropka teardown podkreślnik appcontext otwórz nawias okrągły close podkreślnik db zamknij nawias okrągły. Linia 24. def init podkreślnik db otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 25. cudzysłów cudzysłów cudzysłów Funkcja tworzy bazę i tabele cudzysłów cudzysłów cudzysłów. Linia 26. db znak równości get podkreślnik db otwórz nawias okrągły zamknij nawias okrągły. Linia 27. with current podkreślnik app kropka open podkreślnik resource otwórz nawias okrągły apostrof restauracja kropka sql apostrof zamknij nawias okrągły as f dwukropek. Linia 28. db kropka executescript otwórz nawias okrągły f kropka read otwórz nawias okrągły zamknij nawias okrągły kropka decode otwórz nawias okrągły apostrof utf8 apostrof zamknij nawias okrągły zamknij nawias okrągły.
Ważne!

Podczas obsługi każdego żądania dostępny jest tzw. kontekst aplikacji, w którym znajdują się wszystkie powiązane z żądaniem dane, np. obiekt reprezentujący bazę danych. Dostęp do kontekstu umożliwiają obiekty current_appg. W kontekście aplikacji dostępny jest również słownik konfiguracyjny o nazwie config – utworzymy go w pliku app.py.

Zadaniem funkcji get_db() jest nawiązanie połączenia z bazą i udostępnienie obiektu pozwalającego na wykonywanie na niej operacji w kontekście aplikacji. Do metody connect() z modułu sqlite3 przekazujemy nazwę pliku bazy danych zapisaną w słowniku current_app.config['DATABASE'] oraz argument detect_types = sqlite3.PARSE_DECLTYPES. Flaga PARSE_DECLTYPES oznacza, że baza będzie używała odpowiednich funkcji konwertujących typy danych języka Python na typy danych przechowywane w bazie. Ustawienie row_factory = sqlite3.Row spowoduje, że wyniki zapytań (rekordy) będą zwracane w postaci słowników, w których kluczami będą nagłówki pól.

Zadaniem funkcji db_close() jest zamykanie połączenia z bazą. Funkcja powinna być wywoływana po zakończeniu obsługi każdego żądania, dlatego kolejna funkcja init_app() rejestruje funkcję close_db() za pomocą metody teardown_appcontext() w aplikacji.

Funkcję db_int() wykorzystamy do utworzenia tabel zdefiniowanych w pliku restauracja.sql w pustej bazie danych.

W kolejnym kroku modyfikujemy plik app.py:

Linia 1. import os. Linia 2. from flask import Flask przecinek current podkreślnik app przecinek render podkreślnik template. Linia 3. from db import init podkreślnik app przecinek init podkreślnik db. Linia 5. app znak równości Flask otwórz nawias okrągły podkreślnik podkreślnik name podkreślnik podkreślnik zamknij nawias okrągły. Linia 7. app kropka config kropka from podkreślnik mapping otwórz nawias okrągły. Linia 8. SECRET podkreślnik KEY znak równości apostrof restauracja podkreślnik dev apostrof przecinek. Linia 9. DATABASE znak równości os kropka path kropka join otwórz nawias okrągły app kropka root podkreślnik path przecinek apostrof restauracja kropka db apostrof zamknij nawias okrągły przecinek. Linia 10. SITE podkreślnik NAME znak równości apostrof Restauracja apostrof. Linia 11. zamknij nawias okrągły. Linia 13. init podkreślnik app otwórz nawias okrągły app zamknij nawias okrągły. Linia 15. at app kropka route otwórz nawias okrągły apostrof prawy ukośnik apostrof zamknij nawias okrągły. Linia 16. def index otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 17. return apostrof Strona główna apostrof. Linia 19. with app kropka app podkreślnik context otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 20. if not os kropka path kropka exists otwórz nawias okrągły current podkreślnik app kropka config otwórz nawias kwadratowy apostrof DATABASE apostrof zamknij nawias kwadratowy zamknij nawias okrągły dwukropek. Linia 21. init podkreślnik db otwórz nawias okrągły zamknij nawias okrągły. Linia 22. if podkreślnik podkreślnik name podkreślnik podkreślnik znak równości znak równości cudzysłów podkreślnik podkreślnik main podkreślnik podkreślnik cudzysłów dwukropek. Linia 23. app kropka run otwórz nawias okrągły debug znak równości True zamknij nawias okrągły.

Przede wszystkim uzupełniamy importy, a następnie dodajemy słownik konfiguracyjny config. Klucz SECRET_KEY zawiera ciąg znaków wykorzystywany do zarządzania sesjami – tym zagadnieniem zajmiemy w kolejnym e‑materiale. Klucz DATABASE wskazuje plik bazy danych restauracja.db, który zostanie utworzony w głównym katalogu aplikacji – nie jest to rozwiązanie zalecane ze względów bezpieczeństwa, ale przyjmujemy je dla uproszczenia. Klucz SITE_NAME to po prostu nazwa aplikacji.

Pozostaje nam ponowne uruchomienie aplikacji. W katalogu aplikacji powinien zostać utworzony plik bazy restauracja.db.

Ważne!

Jeżeli w kodzie SQL, który tworzy tabele, wystąpią błędy, utworzona zostanie pusta baza bez tabel. W takim przypadku plik restauracja.db należy usunąć, a po poprawieniu błędów uruchomić aplikację jeszcze raz.

Dania w restauracji

Nasza baza danych składa się z tabel, które możemy traktować jako obiekty. Obsługę poszczególnych obiektów umieścimy w osobnych modułach, określanych we Flasku słowem blueprint. W tym kontekście możemy je rozumieć jako projekt. Zaletą korzystania z projektów jest łatwiejsze utrzymanie porządku i przejrzystości w kodzie oraz możliwość wykorzystania ich w wielu aplikacjach.

W katalogu aplikacji dodajemy plik o nazwie dania.py i umieszczamy w nim następujący kod:

Linia 1. from flask import otwórz nawias okrągły. Linia 2. Blueprint przecinek flash przecinek render podkreślnik template przecinek request przecinek redirect przecinek url podkreślnik for. Linia 3. zamknij nawias okrągły. Linia 4. from werkzeug kropka exceptions import abort. Linia 5. from db import get podkreślnik db. Linia 7. bp znak równości Blueprint otwórz nawias okrągły apostrof dania apostrof przecinek podkreślnik podkreślnik name podkreślnik podkreślnik przecinek url podkreślnik prefix znak równości apostrof prawy ukośnik dania apostrof zamknij nawias okrągły.

Projekt jest instancją klasy Blueprint(), której konstruktor otrzymuje nazwę projektu 'dania' oraz nazwę modułu zawierającego projekt – w tym przypadku jest to nazwa dania.py zwracana przez zmienną name. Trzecim opcjonalnym parametrem jest prefix, którym będą poprzedzane zdefiniowane w projekcie adresy URL.

Widoki

Obsługa każdej operacji wykonywanej na obiektach (tabelach) bazy danych realizowana jest z wykorzystaniem funkcji zwanych widokamiwidokwidokami.

Do pliku dania.py dodajemy kod widoku wyświetlającego listę dań oraz nagłówki widoków, które będą obsługiwały pozostałe operacje:

Linia 1. at bp kropka route otwórz nawias okrągły apostrof prawy ukośnik lista apostrof zamknij nawias okrągły. Linia 2. def lista otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 3. db znak równości get podkreślnik db otwórz nawias okrągły zamknij nawias okrągły. Linia 4. dane znak równości db kropka execute otwórz nawias okrągły apostrof SELECT asterysk FROM dania apostrof zamknij nawias okrągły kropka fetchall otwórz nawias okrągły zamknij nawias okrągły. Linia 5. if not dane dwukropek. Linia 6. flash otwórz nawias okrągły apostrof Brak dań wykrzyknik apostrof zamknij nawias okrągły. Linia 7. return render podkreślnik template otwórz nawias okrągły apostrof dania podkreślnik lista kropka html apostrof przecinek dane znak równości dane zamknij nawias okrągły. Linia 9. at bp kropka route otwórz nawias okrągły apostrof prawy ukośnik dodaj apostrof przecinek methods znak równości otwórz nawias kwadratowy apostrof GET apostrof przecinek apostrof POST apostrof zamknij nawias kwadratowy zamknij nawias okrągły. Linia 10. def dodaj otwórz nawias okrągły d podkreślnik id zamknij nawias okrągły dwukropek. Linia 11. pass. Linia 13. def get podkreślnik danie otwórz nawias okrągły d podkreślnik id zamknij nawias okrągły dwukropek. Linia 14. pass. Linia 16. at bp kropka route otwórz nawias okrągły apostrof prawy ukośnik otwórz nawias ostrokątny int dwukropek d podkreślnik id zamknij nawias ostrokątny prawy ukośnik edytuj apostrof przecinek methods znak równości otwórz nawias kwadratowy apostrof GET apostrof przecinek apostrof POST apostrof zamknij nawias kwadratowy zamknij nawias okrągły. Linia 17. def edytuj otwórz nawias okrągły d podkreślnik id zamknij nawias okrągły dwukropek. Linia 18. pass. Linia 20. at bp kropka route otwórz nawias okrągły apostrof prawy ukośnik otwórz nawias ostrokątny int dwukropek d podkreślnik id zamknij nawias ostrokątny prawy ukośnik usun apostrof przecinek methods znak równości otwórz nawias kwadratowy apostrof GET apostrof przecinek apostrof POST apostrof zamknij nawias kwadratowy zamknij nawias okrągły. Linia 21. def usun otwórz nawias okrągły d podkreślnik id zamknij nawias okrągły dwukropek. Linia 22. pass.

Na początku za pomocą dekoratora route() definiujemy adres URL, dla którego chcemy obsłużyć żądanie, np.: @bp.route('/lista'). Argument '/lista' oznacza adres: http(s)://nazwa_serwera/dania/lista.

Domyślnie obsługiwane są żądania typu GET, czyli pobranie zasobu wskazanego przez URL. Jeżeli chcemy obsłużyć żądanie typu POST, czyli przyjęcie danych przesłanych od klienta do serwera, umieszczamy obydwa typy żądań w argumencie methods: methods=['GET', 'POST'].

Adresy URL mogą zawierać zmienne, np. /<int:d_id>/edytuj, /<int:d_id>/usun. Zmienne te (typu całkowitego) wykorzystamy do przekazania widokom identyfikatorów dań, które będziemy chcieli modyfikować lub usunąć. Przykładowy adres URL, który będzie pozwalał na modyfikację dania, może wyglądać np. tak: /dania/1/edytuj.

Przeanalizujmy działanie widoku lista().

Po utworzeniu obiektu reprezentującego połączenie z bazą za pomocą metody execute() wykonujemy zapytanie SQL, które wybiera wszystkie rekordy z tabeli dania. Metoda fetchall() zwraca wszystkie pobrane rekordy w postaci listy. Zwrócone rekordy możemy traktować jak słowniki, np.:

Linia 1. otwórz nawias kwadratowy otwórz nawias klamrowy apostrof id apostrof dwukropek 1 przecinek apostrof nazwa apostrof dwukropek apostrof zupa ogórkowa apostrof przecinek apostrof cena apostrof dwukropek 17 kropka 5 przecinek apostrof menu apostrof dwukropek 1 zamknij nawias klamrowy przecinek. Linia 2. otwórz nawias klamrowy apostrof id apostrof dwukropek 2 przecinek apostrof nazwa apostrof dwukropek apostrof zupa pomidorowa apostrof przecinek apostrof cena apostrof dwukropek 18 przecinek apostrof menu apostrof dwukropek 1 zamknij nawias klamrowy przecinek. Linia 3. otwórz nawias klamrowy apostrof id apostrof dwukropek 3 przecinek apostrof nazwa apostrof dwukropek apostrof barszcz czerwony apostrof przecinek apostrof cena apostrof dwukropek 14 przecinek apostrof menu apostrof dwukropek 1 zamknij nawias klamrowy zamknij nawias kwadratowy.

Funkcja render_template() wywołuje podany jako pierwszy argument szablon HTML i przekazuje do niego dodatkowe dane, w tym przypadku listę rekordów, która w szablonie będzie dostępna pod nazwą dane. Po przetworzeniu szablonu, co bywa nazywane renderowaniemrenderowanierenderowaniem, przygotowany kod HTML zostanie zwrócony jako odpowiedź na żądanie.

Szablony

W przyjętej przez nas konfiguracji szablony umieszczamy w podkatalogu templates katalogu aplikacji. Ponieważ w obrębie jednego serwisu wiele elementów na stronach WWW powtarza się, korzystamy z szablonu bazowego zapisanego w pliku base.html, którego zawartość jest następująca:

Linia 1. otwórz nawias ostrokątny wykrzyknik DOCTYPE html zamknij nawias ostrokątny. Linia 2. otwórz nawias ostrokątny html lang znak równości cudzysłów pl cudzysłów zamknij nawias ostrokątny. Linia 3. otwórz nawias ostrokątny head zamknij nawias ostrokątny. Linia 4. otwórz nawias ostrokątny meta charset znak równości cudzysłów utf minus 8 cudzysłów zamknij nawias ostrokątny. Linia 5. otwórz nawias ostrokątny title zamknij nawias ostrokątny otwórz nawias klamrowy procent block title procent zamknij nawias klamrowy Restauracja otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy otwórz nawias ostrokątny prawy ukośnik title zamknij nawias ostrokątny. Linia 6. otwórz nawias ostrokątny link rel znak równości cudzysłów stylesheet cudzysłów type znak równości cudzysłów text prawy ukośnik css cudzysłów href znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy url podkreślnik for otwórz nawias okrągły apostrof static apostrof przecinek filename znak równości apostrof style kropka css apostrof zamknij nawias okrągły zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów zamknij nawias ostrokątny. Linia 7. otwórz nawias ostrokątny prawy ukośnik head zamknij nawias ostrokątny. Linia 8. otwórz nawias ostrokątny body zamknij nawias ostrokątny. Linia 9. otwórz nawias ostrokątny header class znak równości cudzysłów center minus txt cudzysłów zamknij nawias ostrokątny. Linia 10. otwórz nawias ostrokątny h1 zamknij nawias ostrokątny Restauracja otwórz nawias ostrokątny prawy ukośnik h1 zamknij nawias ostrokątny. Linia 11. otwórz nawias ostrokątny h2 zamknij nawias ostrokątny otwórz nawias klamrowy procent block podtytul procent zamknij nawias klamrowy otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy otwórz nawias ostrokątny prawy ukośnik h2 zamknij nawias ostrokątny. Linia 12. otwórz nawias ostrokątny prawy ukośnik header zamknij nawias ostrokątny. Linia 14. otwórz nawias ostrokątny nav class znak równości cudzysłów center menu cudzysłów zamknij nawias ostrokątny. Linia 15. otwórz nawias ostrokątny p zamknij nawias ostrokątny. Linia 16. otwórz nawias ostrokątny a href znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy url podkreślnik for otwórz nawias okrągły apostrof index apostrof zamknij nawias okrągły zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów zamknij nawias ostrokątny Restauracja otwórz nawias ostrokątny prawy ukośnik a zamknij nawias ostrokątny. Linia 17. – otwórz nawias ostrokątny a href znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy url podkreślnik for otwórz nawias okrągły apostrof dania kropka lista apostrof zamknij nawias okrągły zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów zamknij nawias ostrokątny Dania otwórz nawias ostrokątny prawy ukośnik a zamknij nawias ostrokątny. Linia 18. otwórz nawias ostrokątny prawy ukośnik p zamknij nawias ostrokątny. Linia 19. otwórz nawias ostrokątny prawy ukośnik nav zamknij nawias ostrokątny. Linia 21. otwórz nawias klamrowy procent with komunikaty znak równości get podkreślnik flashed podkreślnik messages otwórz nawias okrągły zamknij nawias okrągły procent zamknij nawias klamrowy. Linia 22. otwórz nawias klamrowy procent if komunikaty procent zamknij nawias klamrowy. Linia 23. otwórz nawias ostrokątny section class znak równości cudzysłów center info cudzysłów zamknij nawias ostrokątny. Linia 24. otwórz nawias ostrokątny p zamknij nawias ostrokątny. Linia 25. otwórz nawias klamrowy procent for komunikat in komunikaty procent zamknij nawias klamrowy. Linia 26. otwórz nawias ostrokątny span class znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy kategoria zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów zamknij nawias ostrokątny otwórz nawias klamrowy otwórz nawias klamrowy komunikat zamknij nawias klamrowy zamknij nawias klamrowy otwórz nawias ostrokątny prawy ukośnik span zamknij nawias ostrokątny otwórz nawias ostrokątny br zamknij nawias ostrokątny. Linia 27. otwórz nawias klamrowy procent endfor procent zamknij nawias klamrowy. Linia 28. otwórz nawias ostrokątny prawy ukośnik p zamknij nawias ostrokątny. Linia 29. otwórz nawias ostrokątny prawy ukośnik section zamknij nawias ostrokątny. Linia 30. otwórz nawias klamrowy procent endif procent zamknij nawias klamrowy. Linia 31. otwórz nawias klamrowy procent endwith procent zamknij nawias klamrowy. Linia 33. otwórz nawias ostrokątny section class znak równości cudzysłów center tresc cudzysłów zamknij nawias ostrokątny. Linia 34. otwórz nawias klamrowy procent block tresc procent zamknij nawias klamrowy otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy. Linia 35. otwórz nawias ostrokątny prawy ukośnik section zamknij nawias ostrokątny. Linia 37. otwórz nawias ostrokątny footer zamknij nawias ostrokątny Wykonano w aplikacji otwórz nawias ostrokątny a href znak równości cudzysłów https dwukropek prawy ukośnik prawy ukośnik flask kropka palletsprojects kropka com prawy ukośnik en prawy ukośnik 2 kropka 3 kropka x prawy ukośnik cudzysłów zamknij nawias ostrokątny Flask v kropka 2 kropka 3 kropka 2 otwórz nawias ostrokątny prawy ukośnik a zamknij nawias ostrokątny kropka otwórz nawias ostrokątny prawy ukośnik footer zamknij nawias ostrokątny. Linia 39. otwórz nawias ostrokątny prawy ukośnik body zamknij nawias ostrokątny. Linia 40. otwórz nawias ostrokątny prawy ukośnik html zamknij nawias ostrokątny.

Szablon jest zwykłym plikiem tekstowym, który poza kodem HTML zawiera tagi oznaczane ogranicznikami:

  • {{ zmienna lub wyrażenie }} – tagi zawierające zmienne lub wyrażenia pozwalają umieszczać na stronie wartości zmiennych lub wyrażeń,

  • {% instrukcja %} – tagi sterujące pozwalają korzystać z instrukcji takich jak if, for czy with oraz definiować bloki (block), których treść może być nadpisywana lub uzupełniana w szablonach dziedziczących. Tagi te mają otwarcie i zamknięcie, np.: {% if komunikaty %} ... {% endif %} lub {% block tresc %} ... {% endblock %}.

Do generowania adresów URL w szablonie używamy funkcji url_for(). W najprostszej postaci argumentem funkcji jest nazwa widoku (tj. funkcji skojarzonej z adresem URL) z ewentualnym prefiksem, tj. nazwą blueprinta, np.: {{ url_for('dania.lista') }}.

Funkcja get_flashed_messages() zwraca listę komunikatów przygotowywanych w widokach za pomocą funkcji flash(), np. flash('Brak dań!').

Strona główna

W katalogu templates znajdziemy również plik index.html o następującej zawartości:

Linia 1. otwórz nawias klamrowy procent extends apostrof base kropka html apostrof procent zamknij nawias klamrowy. Linia 2. otwórz nawias klamrowy procent block podtytul procent zamknij nawias klamrowy Strona główna otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy. Linia 3. otwórz nawias klamrowy procent block tresc procent zamknij nawias klamrowy Witamy wykrzyknik otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy.

Pierwsza linia oznacza, że zawartość dziedziczona jest z szablonu base.html. Druga i trzecia linia pokazują, w jaki sposób wstawiamy treść do zdefiniowanych w szablonie bazowym bloków.

Szablon listy dań

Teraz dodamy szablon, który pozwoli pokazać listę dań. Do katalogu templates dodajemy nowy plik o nazwie dania_lista.html z następującą zawartością:

Linia 1. otwórz nawias klamrowy procent extends cudzysłów base kropka html cudzysłów procent zamknij nawias klamrowy. Linia 2. otwórz nawias klamrowy procent block podtytul procent zamknij nawias klamrowy Dania – lista otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy. Linia 4. otwórz nawias klamrowy procent block tresc procent zamknij nawias klamrowy. Linia 5. otwórz nawias ostrokątny ol zamknij nawias ostrokątny. Linia 6. otwórz nawias klamrowy procent for rekord in dane procent zamknij nawias klamrowy. Linia 7. otwórz nawias ostrokątny li zamknij nawias ostrokątny otwórz nawias klamrowy otwórz nawias klamrowy rekord kropka nazwa zamknij nawias klamrowy zamknij nawias klamrowy przecinek otwórz nawias klamrowy otwórz nawias klamrowy rekord kropka cena zamknij nawias klamrowy zamknij nawias klamrowy przecinek otwórz nawias klamrowy procent if rekord kropka menu procent zamknij nawias klamrowy dostępne otwórz nawias klamrowy procent else procent zamknij nawias klamrowy niedostępne otwórz nawias klamrowy procent endif procent zamknij nawias klamrowy –. Linia 8. otwórz nawias ostrokątny a href znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy url podkreślnik for otwórz nawias okrągły apostrof dania kropka edytuj apostrof przecinek d podkreślnik id znak równości rekord kropka id zamknij nawias okrągły zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów zamknij nawias ostrokątny Edytuj otwórz nawias ostrokątny prawy ukośnik a zamknij nawias ostrokątny przecinek. Linia 9. otwórz nawias ostrokątny a href znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy url podkreślnik for otwórz nawias okrągły apostrof dania kropka usun apostrof przecinek d podkreślnik id znak równości rekord kropka id zamknij nawias okrągły zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów zamknij nawias ostrokątny Usuń otwórz nawias ostrokątny prawy ukośnik a zamknij nawias ostrokątny. Linia 10. otwórz nawias ostrokątny prawy ukośnik li zamknij nawias ostrokątny. Linia 11. otwórz nawias klamrowy procent endfor procent zamknij nawias klamrowy. Linia 12. otwórz nawias ostrokątny prawy ukośnik ol zamknij nawias ostrokątny. Linia 13. otwórz nawias ostrokątny p zamknij nawias ostrokątny otwórz nawias ostrokątny a href znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy url podkreślnik for otwórz nawias okrągły apostrof dania kropka dodaj apostrof zamknij nawias okrągły zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów zamknij nawias ostrokątny Dodaj danie otwórz nawias ostrokątny prawy ukośnik a zamknij nawias ostrokątny otwórz nawias ostrokątny prawy ukośnik p zamknij nawias ostrokątny. Linia 14. otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy.

Najważniejszym fragmentem jest pętla for, która odczytuje kolejne rekordy z listy dane. Dostęp do pól rekordu uzyskujemy dzięki notacji z kropką, np.: rekord.nazwa. Kolejne wywołania funkcji url_for() generują adresy URL pozwalające na modyfikowanie, usuwanie i dodawanie dań.

Rejestracja projektu

Projekt obsługujący dania musimy zarejestrować w aplikacji. Modyfikujemy fragment pliku app.py:

Linia 1. import os. Linia 2. from flask import Flask przecinek current podkreślnik app przecinek render podkreślnik template. Linia 3. from db import init podkreślnik app przecinek init podkreślnik db. Linia 4. import dania. Linia 6. app znak równości Flask otwórz nawias okrągły podkreślnik podkreślnik name podkreślnik podkreślnik zamknij nawias okrągły. Linia 8. app kropka config kropka from podkreślnik mapping otwórz nawias okrągły. Linia 9. SECRET podkreślnik KEY znak równości apostrof restauracja podkreślnik dev apostrof przecinek. Linia 10. DATABASE znak równości os kropka path kropka join otwórz nawias okrągły app kropka root podkreślnik path przecinek apostrof restauracja kropka db apostrof zamknij nawias okrągły przecinek. Linia 11. SITE podkreślnik NAME znak równości apostrof Restauracja apostrof. Linia 12. zamknij nawias okrągły. Linia 14. init podkreślnik app otwórz nawias okrągły app zamknij nawias okrągły. Linia 15. kratka rejestracja projektów. Linia 16. app kropka register podkreślnik blueprint otwórz nawias okrągły dania kropka bp zamknij nawias okrągły. Linia 19. at app kropka route otwórz nawias okrągły apostrof prawy ukośnik apostrof zamknij nawias okrągły. Linia 20. def index otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 21. kratka return apostrof Strona główna apostrof. Linia 22. return render podkreślnik template otwórz nawias okrągły apostrof index kropka html apostrof zamknij nawias okrągły. Linia 24. with app kropka app podkreślnik context otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 25. if not os kropka path kropka exists otwórz nawias okrągły current podkreślnik app kropka config otwórz nawias kwadratowy apostrof DATABASE apostrof zamknij nawias kwadratowy zamknij nawias okrągły dwukropek. Linia 26. init podkreślnik db otwórz nawias okrągły zamknij nawias okrągły. Linia 27. if podkreślnik podkreślnik name podkreślnik podkreślnik znak równości znak równości cudzysłów podkreślnik podkreślnik main podkreślnik podkreślnik cudzysłów dwukropek. Linia 28. app kropka run otwórz nawias okrągły debug znak równości True zamknij nawias okrągły.

Przede wszystkim dodajemy import modułu dania. Następnie rejestrujemy blueprint dania w aplikacji: app.register_blueprint(dania.bp) – od tej pory obsługiwane będą zdefiniowane w nim adresy URL.

Dodatkowo w widoku index() umieszczamy wywołanie funkcji renderującej szablon strony głównej return render_template('index.html').

Ważne!

Pliki app.py oraz dania.py muszą znajdować się w katalogu aplikacji, w przeciwnym razie po uruchomieniu aplikacji możemy zobaczyć błąd ModuleNotFoundError: No module named 'dania' informujący o nieodnalezieniu modułu dania.

Uruchamiamy aplikację, otwieramy stronę główną, a następnie klikamy w link Dania. Powinniśmy zobaczyć pokazane na zrzutach strony.

Rf0zLP9MzhxX4
Strona główna serwisu.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
R1CWaUsWABZuj
Strona z listą dań.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Dodawanie dań

Uzupełniamy widok dodaj():

Linia 1. at bp kropka route otwórz nawias okrągły apostrof prawy ukośnik dodaj apostrof przecinek methods znak równości otwórz nawias kwadratowy apostrof GET apostrof przecinek apostrof POST apostrof zamknij nawias kwadratowy zamknij nawias okrągły. Linia 2. def dodaj otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 3. if request kropka method znak równości znak równości apostrof POST apostrof dwukropek. Linia 4. nazwa znak równości request kropka form otwórz nawias kwadratowy apostrof nazwa apostrof zamknij nawias kwadratowy kropka strip otwórz nawias okrągły zamknij nawias okrągły. Linia 5. cena znak równości request kropka form otwórz nawias kwadratowy apostrof cena apostrof zamknij nawias kwadratowy kropka strip otwórz nawias okrągły zamknij nawias okrągły. Linia 6. menu znak równości 0. Linia 7. if apostrof menu apostrof in request kropka form dwukropek. Linia 8. menu znak równości 1. Linia 9. db znak równości get podkreślnik db otwórz nawias okrągły zamknij nawias okrągły. Linia 10. db kropka execute otwórz nawias okrągły apostrof INSERT INTO dania VALUES otwórz nawias okrągły znak zapytania przecinek znak zapytania przecinek znak zapytania przecinek znak zapytania zamknij nawias okrągły apostrof przecinek otwórz nawias kwadratowy None przecinek nazwa przecinek cena przecinek menu zamknij nawias kwadratowy zamknij nawias okrągły. Linia 11. db kropka commit otwórz nawias okrągły zamknij nawias okrągły. Linia 12. flash otwórz nawias okrągły f apostrof Dodano danie dwukropek otwórz nawias klamrowy nazwa zamknij nawias klamrowy apostrof zamknij nawias okrągły. Linia 13. return redirect otwórz nawias okrągły url podkreślnik for otwórz nawias okrągły apostrof dania kropka lista apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 15. return render podkreślnik template otwórz nawias okrągły apostrof danie podkreślnik dodaj kropka html apostrof zamknij nawias okrągły.

Obiekt request zawiera wszystkie informacje przesłane w żądaniu, m.in. typ. Jeżeli otrzymamy żądanie typu GET, zwracamy szablon danie_dodaj.html, który zawiera formularz HTML pozwalający przesłać informacje o daniu.

Po wysłaniu formularza otrzymamy żądanie typu POST. Wtedy ze słownika form odczytujemy wartości kolejnych pól formularza. Nawiązujemy połączenie z bazą i wykonujemy zapytanie INSERT INTO dania VALUES (?, ?, ?, ?). Znaki zapytania, zostaną zastąpione kolejnymi podanymi w liście lub tupli, wartościami: [None, nazwa, cena, menu].

Po zatwierdzeniu zapytania przygotowujemy komunikat dla użytkownika za pomocą funkcji flash(), a następnie przekierowujemy obsługę żądania do widoku lista() za pomocą instrukcji return redirect(). Argumentem funkcji redirect() jest adres URL zwrócony przez omawianą już funkcję url_for().

Do katalogu templates dodajemy szablon danie_dodaj.html:

Linia 1. otwórz nawias klamrowy procent extends cudzysłów base kropka html cudzysłów procent zamknij nawias klamrowy. Linia 2. otwórz nawias klamrowy procent block podtytul procent zamknij nawias klamrowy Danie – dodawanie otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy. Linia 4. otwórz nawias klamrowy procent block tresc procent zamknij nawias klamrowy. Linia 5. otwórz nawias ostrokątny form method znak równości cudzysłów POST cudzysłów action znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy url podkreślnik for otwórz nawias okrągły apostrof dania kropka dodaj apostrof zamknij nawias okrągły zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów zamknij nawias ostrokątny. Linia 6. otwórz nawias ostrokątny label for znak równości cudzysłów nazwa cudzysłów zamknij nawias ostrokątny Nazwa dwukropek otwórz nawias ostrokątny prawy ukośnik label zamknij nawias ostrokątny. Linia 7. otwórz nawias ostrokątny input type znak równości cudzysłów text cudzysłów id znak równości cudzysłów nazwa cudzysłów name znak równości cudzysłów nazwa cudzysłów value znak równości cudzysłów cudzysłów required zamknij nawias ostrokątny. Linia 8. otwórz nawias ostrokątny br zamknij nawias ostrokątny. Linia 9. otwórz nawias ostrokątny label for znak równości cudzysłów cena cudzysłów zamknij nawias ostrokątny Cena dwukropek otwórz nawias ostrokątny prawy ukośnik label zamknij nawias ostrokątny. Linia 10. otwórz nawias ostrokątny input type znak równości cudzysłów number cudzysłów id znak równości cudzysłów cena cudzysłów name znak równości cudzysłów cena cudzysłów min znak równości cudzysłów kropka 01 cudzysłów value znak równości cudzysłów 0 kropka 01 cudzysłów step znak równości cudzysłów kropka 01 cudzysłów required zamknij nawias ostrokątny. Linia 11. otwórz nawias ostrokątny br zamknij nawias ostrokątny. Linia 12. otwórz nawias ostrokątny label for znak równości cudzysłów menu cudzysłów zamknij nawias ostrokątny Czy w menu dwukropek otwórz nawias ostrokątny prawy ukośnik label zamknij nawias ostrokątny. Linia 13. otwórz nawias ostrokątny input type znak równości cudzysłów checkbox cudzysłów id znak równości cudzysłów menu cudzysłów name znak równości cudzysłów menu cudzysłów checked znak równości cudzysłów checked cudzysłów zamknij nawias ostrokątny. Linia 14. otwórz nawias ostrokątny br zamknij nawias ostrokątny. Linia 15. otwórz nawias ostrokątny button type znak równości cudzysłów submit cudzysłów zamknij nawias ostrokątny Dodaj otwórz nawias ostrokątny prawy ukośnik button zamknij nawias ostrokątny. Linia 16. otwórz nawias ostrokątny prawy ukośnik form zamknij nawias ostrokątny. Linia 17. otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy.

Formularze WWW są odpowiednikiem graficznego interfejsu aplikacji desktopowych. Przygotowanie w pełni funkcjonalnego i wygodnego formularza wymaga użycia wszystkich technologii używanych do tworzenia stron WWW, tzn. języka HTML, arkuszy stylów CSS oraz języka JavaScript. W naszych e‑materiałach ograniczamy się do możliwości, które daje język HTML.

Więcej na temat budowy i przetwarzania formularzy znajdziesz w kolejnym e‑materiale.

Po uruchomieniu aplikacji będziemy mogli dodawać dania.

R1Whq4BWLJ3tD
Formularz dodawania dań.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
R9l9umZPiRUSf
Potwierdzenie dodania dania.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Edycja dań

W pliku danie.py uzupełniamy kod funkcji pomocniczej get_danie() oraz widok edytuj():

Linia 1. def get podkreślnik danie otwórz nawias okrągły d podkreślnik id zamknij nawias okrągły dwukropek. Linia 2. db znak równości get podkreślnik db otwórz nawias okrągły zamknij nawias okrągły. Linia 3. danie znak równości db kropka execute otwórz nawias okrągły apostrof SELECT asterysk FROM dania WHERE id znak równości znak zapytania apostrof przecinek otwórz nawias kwadratowy d podkreślnik id zamknij nawias kwadratowy zamknij nawias okrągły kropka fetchone otwórz nawias okrągły zamknij nawias okrągły. Linia 4. if danie is None dwukropek. Linia 5. abort otwórz nawias okrągły 404 przecinek f cudzysłów Danie o id otwórz nawias klamrowy id zamknij nawias klamrowy nie istnieje kropka cudzysłów zamknij nawias okrągły. Linia 6. return danie. Linia 9. at bp kropka route otwórz nawias okrągły apostrof prawy ukośnik.

Adres URL edycji dania zawiera jego identyfikator, który zostaje przekazany jako argument d_id do widoku. Na początku korzystamy z funkcji get_danie(), aby odczytać odpowiedni rekord z bazy. Jeżeli dania o podanym identyfikatorze w bazie nie ma, do klienta zostanie zwrócona strona z kodem błędu 404 i odpowiednim komunikatem.

R1aQn4tn1SKt6
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Jeżeli funkcja get_danie() zwróci informacje o daniu, w przypadku żądania typu GET zwracamy szablon danie_edytuj.html, który zawiera taki sam formularz, jak podczas dodawania dania, z tym że jego pola uzupełniamy informacjami o daniu przekazanymi w zmiennej rekord.

R16eT4876Y9oM
Edycja dania.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Po otrzymaniu żądania typu POST i danych z formularza wykonujemy te same operacje jak podczas tworzenia dania, tj. ustalamy wartości poszczególnych pól. Następnie wykonujemy zapytanie 'UPDATE dania SET nazwa = ?, cena = ?, menu = ? WHERE id = ?', i przekazujemy wartości pól w odpowiedniej kolejności w liście: [nazwa, cena, menu, d_id].

Na koniec zatwierdzamy zmiany w bazie, przygotowujemy komunikat i za pomocą przekierowania zwracamy listę dań.

RLfYgdviR3Hyj
Potwierdzenie zaktualizowania dania.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Zanim sprawdzimy działanie edycji, szablon danie_edytuj.html umieszczamy w katalogu templates:

Linia 1. otwórz nawias klamrowy procent extends cudzysłów base kropka html cudzysłów procent zamknij nawias klamrowy. Linia 2. otwórz nawias klamrowy procent block podtytul procent zamknij nawias klamrowy Danie – edycja otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy. Linia 4. otwórz nawias klamrowy procent block tresc procent zamknij nawias klamrowy. Linia 5. otwórz nawias ostrokątny form method znak równości cudzysłów POST cudzysłów action znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy url podkreślnik for otwórz nawias okrągły apostrof dania kropka edytuj apostrof przecinek d podkreślnik id znak równości rekord kropka id zamknij nawias okrągły zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów zamknij nawias ostrokątny. Linia 6. otwórz nawias ostrokątny label for znak równości cudzysłów nazwa cudzysłów zamknij nawias ostrokątny Nazwa dwukropek otwórz nawias ostrokątny prawy ukośnik label zamknij nawias ostrokątny. Linia 7. otwórz nawias ostrokątny input type znak równości cudzysłów text cudzysłów id znak równości cudzysłów nazwa cudzysłów name znak równości cudzysłów nazwa cudzysłów value znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy rekord kropka nazwa zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów required zamknij nawias ostrokątny. Linia 8. otwórz nawias ostrokątny br zamknij nawias ostrokątny. Linia 9. otwórz nawias ostrokątny label for znak równości cudzysłów cena cudzysłów zamknij nawias ostrokątny Cena dwukropek otwórz nawias ostrokątny prawy ukośnik label zamknij nawias ostrokątny. Linia 10. otwórz nawias ostrokątny input type znak równości cudzysłów number cudzysłów id znak równości cudzysłów cena cudzysłów name znak równości cudzysłów cena cudzysłów min znak równości cudzysłów kropka 01 cudzysłów value znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy rekord kropka cena zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów step znak równości cudzysłów kropka 01 cudzysłów required zamknij nawias ostrokątny. Linia 11. otwórz nawias ostrokątny br zamknij nawias ostrokątny. Linia 12. otwórz nawias ostrokątny label for znak równości cudzysłów menu cudzysłów zamknij nawias ostrokątny Czy w menu dwukropek otwórz nawias ostrokątny prawy ukośnik label zamknij nawias ostrokątny. Linia 13. otwórz nawias ostrokątny input type znak równości cudzysłów checkbox cudzysłów id znak równości cudzysłów menu cudzysłów name znak równości cudzysłów menu cudzysłów otwórz nawias klamrowy procent if rekord kropka menu procent zamknij nawias klamrowy checked znak równości cudzysłów checked cudzysłów otwórz nawias klamrowy procent endif procent zamknij nawias klamrowy zamknij nawias ostrokątny. Linia 14. otwórz nawias ostrokątny br zamknij nawias ostrokątny. Linia 15. otwórz nawias ostrokątny button type znak równości cudzysłów submit cudzysłów zamknij nawias ostrokątny Zapisz otwórz nawias ostrokątny prawy ukośnik button zamknij nawias ostrokątny. Linia 16. otwórz nawias ostrokątny prawy ukośnik form zamknij nawias ostrokątny. Linia 17. otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy.

Usuwanie dań

Uzupełniamy kod widoku usun() w pliku dania.py:

Linia 1. at bp kropka route otwórz nawias okrągły apostrof prawy ukośnik otwórz nawias ostrokątny int dwukropek d podkreślnik id zamknij nawias ostrokątny prawy ukośnik usun apostrof przecinek methods znak równości otwórz nawias kwadratowy apostrof GET apostrof przecinek apostrof POST apostrof zamknij nawias kwadratowy zamknij nawias okrągły. Linia 2. def usun otwórz nawias okrągły d podkreślnik id zamknij nawias okrągły dwukropek. Linia 3. rekord znak równości get podkreślnik danie otwórz nawias okrągły d podkreślnik id zamknij nawias okrągły. Linia 4. if request kropka method znak równości znak równości apostrof POST apostrof dwukropek. Linia 5. db znak równości get podkreślnik db otwórz nawias okrągły zamknij nawias okrągły. Linia 6. db kropka execute otwórz nawias okrągły apostrof DELETE FROM dania WHERE id znak równości znak zapytania apostrof przecinek otwórz nawias kwadratowy d podkreślnik id zamknij nawias kwadratowy zamknij nawias okrągły. Linia 7. db kropka commit otwórz nawias okrągły zamknij nawias okrągły. Linia 8. flash otwórz nawias okrągły f apostrof Usunięto danie id otwórz nawias klamrowy d podkreślnik id zamknij nawias klamrowy otwórz nawias klamrowy rekord otwórz nawias kwadratowy cudzysłów nazwa cudzysłów zamknij nawias kwadratowy zamknij nawias klamrowy apostrof zamknij nawias okrągły. Linia 9. return redirect otwórz nawias okrągły url podkreślnik for otwórz nawias okrągły apostrof dania kropka lista apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 10. return render podkreślnik template otwórz nawias okrągły cudzysłów danie podkreślnik usun kropka html cudzysłów przecinek rekord znak równości rekord zamknij nawias okrągły.

Dodajemy szablon danie_usun.html:

Linia 1. otwórz nawias klamrowy procent extends cudzysłów base kropka html cudzysłów procent zamknij nawias klamrowy. Linia 2. otwórz nawias klamrowy procent block podtytul procent zamknij nawias klamrowy Danie – usuwanie otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy. Linia 4. otwórz nawias klamrowy procent block tresc procent zamknij nawias klamrowy. Linia 5. otwórz nawias ostrokątny form method znak równości cudzysłów POST cudzysłów action znak równości cudzysłów otwórz nawias klamrowy otwórz nawias klamrowy url podkreślnik for otwórz nawias okrągły apostrof dania kropka usun apostrof przecinek d podkreślnik id znak równości rekord kropka id zamknij nawias okrągły zamknij nawias klamrowy zamknij nawias klamrowy cudzysłów zamknij nawias ostrokątny. Linia 6. otwórz nawias ostrokątny p zamknij nawias ostrokątny Czy na pewno usunąć danie dwukropek otwórz nawias ostrokątny prawy ukośnik p zamknij nawias ostrokątny. Linia 7. otwórz nawias ostrokątny p zamknij nawias ostrokątny otwórz nawias klamrowy otwórz nawias klamrowy rekord kropka nazwa zamknij nawias klamrowy zamknij nawias klamrowy przecinek otwórz nawias klamrowy otwórz nawias klamrowy rekord kropka cena zamknij nawias klamrowy zamknij nawias klamrowy przecinek otwórz nawias klamrowy procent if rekord kropka czy podkreślnik w podkreślnik menu procent zamknij nawias klamrowy dostępne otwórz nawias klamrowy procent else procent zamknij nawias klamrowy niedostępne otwórz nawias klamrowy procent endif procent zamknij nawias klamrowy otwórz nawias ostrokątny prawy ukośnik p zamknij nawias ostrokątny. Linia 8. otwórz nawias ostrokątny br zamknij nawias ostrokątny. Linia 9. otwórz nawias ostrokątny button type znak równości cudzysłów submit cudzysłów zamknij nawias ostrokątny Usuń otwórz nawias ostrokątny prawy ukośnik button zamknij nawias ostrokątny. Linia 10. otwórz nawias ostrokątny prawy ukośnik form zamknij nawias ostrokątny. Linia 11. otwórz nawias klamrowy procent endblock procent zamknij nawias klamrowy.

Jeżeli otrzymamy adres URL np. w postaci /dania/1/usun, wówczas podobnie jak w przypadku edycji próbujemy odczytać odpowiedni rekord z bazy, aby sprawdzić, czy danie o podanym identyfikatorze (d_id) istnieje. Jeśli tak, wyświetlamy prosty formularz (odpowiedź na żądanie typu GET) umożliwiający użytkownikowi potwierdzenie usunięcia danych. Jeżeli użytkownik naciśnie przycisk Usuń (żądanie typu POST), wykonujemy zapytanie DELETE FROM dania WHERE id = ?, w którym znak zapytania zastąpiony zostanie identyfikatorem dania: [d_id]. Po zatwierdzeniu zmian przygotowujemy komunikat (flash()) i wyświetlamy listę dań (return redirect()).

R1XE14QouBmTB
Formularz usuwania dania.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
RILuffJk1pEQP
Potwierdzenie usunięcia dania.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Słownik

adres URL
adres URL

lokalizacja zasobu dostępnego w sieci; więcej znajdziesz w e‑materiale Protokoły HTTPP18Nwz7ZeProtokoły HTTP

atrybut kluczowy
atrybut kluczowy

pole (lub kombinacja pól) zawierające niepowtarzalne wartości, jednoznacznie identyfikujące rekordy tabeli; najczęściej zawiera kolejne wartości liczbowe automatycznie tworzone przez aparat bazy danych

back‑end
back‑end

oprogramowanie, które obsługuje żądania klienta (np. wykonuje operacje na bazie danych)

dekorator
dekorator

funkcja, która jako argument otrzymuje inną funkcję, rozszerza jej działanie i zwraca ją

encja
encja

(ang. entity) schematyczny opis rzeczywistych lub abstrakcyjnych obiektów za pomocą tzw. atrybutów lub własności wskazujących ich cechy

front‑end
front‑end

graficzny interfejs użytkownika, tj. strony WWW wyświetlane w przeglądarce, w tym strony zawierające formularze pozwalające wysyłać dane na serwer, na którym działa oprogramowanie

klient‑serwer
klient‑serwer

rozwiązanie polegające na podziale zadań realizowanych przez systemy komputerowe, w którym klient wysyła żądania, a serwer przetwarza je i zazwyczaj odsyła odpowiedź, np. w postaci kodu strony WWW

pętla zwrotna
pętla zwrotna

mechanizm oddziaływania skutków działań danego systemu na stan tego systemu; każdy komputer w sieci, oprócz właściwego (publicznego lub prywatnego) adresu IPv4 wykorzystywanego do komunikacji ma przypisany również adres 127.0.0.1, który jest adresem tego komputera; jest to tzw. adres pętli zwrotnej

renderowanie
renderowanie

w kontekście aplikacji WWW: przygotowanie kodu HTML strony WWW zawierającej dane pobrane z bazy danych

widok
widok

skojarzona z określonym adresem URL funkcja, której zadaniem jest przygotować odpowiedź aplikacji na żądanie obsługiwane przez serwer