jesteś tutaj�
345
Protokół zarządzania kontekstem
Kod demontujący powoduje zatwierdzenie wszystkich danych do zapisu w bazie, a następnie zamyka kursor
oraz połączenie. Demontaż ten odbywa się za
każdym razem, gdy komunikujesz się ze swoją bazą danych,
więc dodajmy ten fragment do klasy menedżera kontekstu, przenosząc odpowiednie trzy wiersze kodu do
metody
__exit__
.
Zanim to jednak zrobisz, powinieneś się dowiedzieć, że z metodą
__exit__
wiąże się pewna komplikacja.
Chodzi o to, że metoda ta musi obsłużyć wszystkie wyjątki, które mogą się pojawić w trakcie wykonywania
zestawu instrukcji
with
. Gdy coś pójdzie źle, interpreter zawsze powiadamia o tym metodę
__exit__
,
przekazując jej trzy argumenty:
exec_type
,
exc_value
oraz
exc_trace
. Tworząc wiersz
def
tej metody,
musisz wziąć to pod uwagę. Z tego też powodu dodaliśmy tam trzy argumenty, o czym możesz się przekonać
poniżej. Mimo to na razie mamy zamiar zupełnie
zignorować ten mechanizm obsługi wyjątków, jednak
powrócimy do niego w dalszej części niniejszego rozdziału, gdy będziemy omawiać to, co może pójść nie tak,
i jak możemy sobie z tym poradzić (dlatego bądź czujny).
Przeprowadź demontaż za pomocą metody __exit__
Dunder
exit
to miejsce na kod demontujący, który powinien być wykonany, gdy Twoja instrukcja
with
kończy swoje działanie. Przypomnij sobie fragment kodu funkcji
log_request
, który odpowiadał za
wymagane tu działania. Został on przedstawiony poniżej.
...
cursor.execute(_SQL, (req.form[‘phrase’],
req.form[‘letters’],
req.remote_addr,
req.user_agent.browser,
res, ))
conn.commit()
cursor.close()
conn.close()
To jest kod
demontujący.
Kod demontujący to ten, w którym powinniśmy zadbać o posprzątanie po
swoich operacjach. W przypadku naszego menedżera kontekstu sprzątanie
oznacza zapewnienie, że wszystkie dane są zatwierdzone w bazie danych przed
zamknięciem kursora oraz połączenia. Do przedstawionej poniżej metody dodaj
kod, który wydaje Ci się potrzebny.
def __exit__(self, exc_type, exc_value, exc_trace) :
W tym miejscu
dodaj kod
demontujący.
Na razie nie przejmuj się tymi argumentami.
Zaostrz ołówek
346
Rozdział 9.
Metoda __exit__ załatwiona
def __exit__(self, exc_type, exc_value, exc_trace) -> None:
self.conn.close()
Na razie nie przejmuj się tymi argumentami.
self.conn.commit()
self.cursor.close()
Zapisane wcześniej atrybuty
są wykorzystywane do
zatwierdzenia niezapisanych
danych, jak również zamknięcia
kursora oraz połączenia. Jak
zawsze pamiętaj tutaj, aby
nazwy atrybutów poprzedzić
przedrostkiem self.
-> None
Ta adnotacja informuje, że
metoda nie zwraca wartości;
adnotacje tego rodzaju są
opcjonalne, ale ich dodawanie
stanowi dobrą praktykę.
Zaostrz ołówek
Rozwiązanie
Kod demontujący to ten, w którym powinniśmy zadbać o posprzątanie po swoich
operacjach. W przypadku naszego menedżera kontekstu sprzątanie oznacza zapewnienie,
że wszystkie dane są zatwierdzone w bazie danych przed zamknięciem kursora oraz
połączenia. Do przedstawionej poniżej metody miałeś dodać kod, który wydaje Ci się
potrzebny.
Ukończona
klasa
menedżera
kontekstu
UseDatabase
„Prawdziwy” kod klasy zawierałby dokumentację, ale usunęliśmy
ją stąd, aby zaoszczędzić trochę miejsca (na tej stronie). Pliki
z kodami przedstawionymi w tej książce, które możesz pobrać,
zawsze opatrzone są komentarzami.
Twój menedżer kontekstu jest gotów do testów
Gdy napisałeś już kod metody
__exit__
, nadszedł czas na przetestowanie Twojego menedżera kontekstu,
zanim będziemy mogli zintegrować go z kodem aplikacji WWW. Jak już mamy w zwyczaju, najpierw
sprawdźmy ten nowy kod w wierszu poleceń powłoki Pythona. Przedtem jednak po raz ostatni upewnij się,
że Twój kod jest taki sam jak nasz.
jesteś tutaj�
347
Protokół zarządzania kontekstem
Zaimportuj
klasę menedżera
kontekstu z pliku
modułu DBcm.py.
Umieść właściwości
połączenia w słowniku.
Użyj menedżera
kontekstu w celu
wysłania zapytania
SQL do serwera
i odebrania
wynikowych danych.
Zwrócone dane mogą wydawać Ci się trochę dziwne, dopóki
nie przypomnisz sobie, że wywołanie metody cursor.fetchall
zwraca listę krotek, z których każda odpowiada wierszowi
wyników (zwróconych z bazy danych).
Jazda próbna
Przejdź do okna edycji środowiska IDLE, w którym otwarty jest kod zapisany w pliku
DBcm.py
, a następnie naciśnij
klawisz
F5
, aby przetestować swój menedżer kontekstu.
Nie ma tu zbyt wiele kodu, prawda?
Mamy nadzieję, że przyglądając się przedstawionemu powyżej kodowi, stwierdzisz, że nie wygląda on
zbyt strasznie. Dzięki temu, że udało Ci się przenieść część swojego kodu obsługi bazy danych do klasy
UseDatabase
, operacje inicjalizacji, konfiguracji i demontażu odbywają się teraz „w tle” i odpowiada
za nie opracowany przez Ciebie menedżer kontekstu. Musisz tu jedynie podać właściwości połączenia
oraz zapytanie SQL, które chcesz wykonać, a Twój menedżer załatwi za Ciebie całą resztę. Kod
odpowiedzialny za przygotowanie operacji i posprzątanie po niej jest ponownie wykorzystywany jako część
menedżera kontekstu. Wyraźniej widać też teraz, co jest „treścią” tego kodu: pobranie danych z bazy i ich
przetworzenie. Menedżer kontekstu ukrywa szczegóły łączenia się z bazą danych oraz rozłączania z nią
(które zawsze pozostaną takie same), pozwalając Ci się skupić na tym, co naprawdę chcesz zrobić
ze swoimi danymi.
Zaktualizujmy kod Twojej aplikacji WWW w taki sposób,
aby wykorzystywała ten menedżer kontekstu.
Get Python Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.