Techniki Zaawansowane
3 godz. 43 min · Python · Full-stack i Programowanie
Grzegorz SzymborskiProgramistaJeżeli na samym początku nie przygotujemy dobrze projektu, to gdy wrócimy do niego po dłuższym czasie - czekają nas kłopoty. Jeżeli uda się nam go uruchomić, to rozeznanie się w nim będzie udręką. Prowadzący pokaże Ci jak wyglądają jego produkcyjne aplikacje, na co zwraca uwagę i co pomaga mu trzymać porządek.
Biblioteka pytest posiada wiele ciekawych funkcjonalności. Parametryzowanie testów, fixture i uproszczona składnia pozwalają nam skupić na testowaniu tego, co kluczowe, wydzielając mniej istotne fragmenty kodu. To wszystko sprawia, że w pewnym momencie łatwiej będzie Ci pisać testy, niż ręcznie sprawdzać poprawność działania apki.
Jeżeli aplikacja, którą stworzysz, osiągnie dużą popularność, może się okazać, że przytłoczona dużym ruchem zacznie spowalniać... lub całkowicie przestanie odpowiadać. Opiszemy różne techniki służące temu, by temu zaradzić - od metod select i prefetch related, aż po cache. Na deser przeprowadzimy na stronie test obciążeniowy za pomocą narzędzia locust.
Django i Postgres to świetne połączenie. Framework ten posiada wbudowaną obsługę wyszukiwania pełnotekstowego oferowanego przez tę bazę. Warto wiedzieć, kiedy jej użyć, a kiedy wystarczy zwykłe icontains.
ORM w Django ułatwia mnóstwo operacji. A czasem nie dość to, że ułatwia... to jeszcze przyspiesza! Chcemy zainspirować Cię czterema metodami: annotate, aggregate, bulkupdate i bulkcreate. Gdy pojawią się one w naszym kodzie, zaczniemy doceniać uroki frameworka Django.
Kurs jest stworzony dla osób, które znają już podstawy Django i wiedzą, jak pisać proste strony. Znają modele, widoki, oraz niestraszny im jest Python. Zalecana jest również podstawowa znajomość dowolnej relacyjnej bazy danych. W kursie przedstawiamy niekiedy narzędzia i praktyczne przykłady, jak można ich użyć, ale w celu zaimplementowania konkretnego rozwiązania w projekcie wymagana będzie umiejętność czytania dokumentacji.
W tej lekcji porozmawiamy sobie o skąd pisze.
Wyobraźmy sobie sytuację w której mamy.
1 pieniądz i z mistycznego punktu widzenia.
10 osób chce go wziąć. Walić ją.
Czegoś takiego byłoby w pierwszym kroku
sprawdzenie czy mamy dostępny pieniądz a w drugim kroku pobranie pieniądza.
I teraz wyobraźmy sobie że 10 osób jednocześnie wchodzi do kroku za
sprawdzeniem czy pieniądz istnieje pieniądz istnieje.
I wyobraźmy sobie że równolegle
wszyscy przechodzą do następnego kroku czyli w tym samym momencie.
10 osób pobiera ten sam pieniądz.
Bardzo podobny przykład zaprezentuje Wam w
tym kodzie mamy model account który jedyne co posiada to stan konta.
Ma opisaną również metodę która będzie z tego konta coś wyciągnęła.
Przygotowałem również wyjątek.
Który dziedziczy po eks.
Nie robi nic nadzwyczajnego poza tym że poprawi nam czytelność w momencie jeżeli
wartość którą chcemy wypłacić jest większa niż.
Aktualny stan naszego konta wtedy zostanie zgłoszony wyjątek.
Jeżeli jest inaczej to wtedy podejmujemy
tę wartość od salda zapisujemy i tak w ramach pokazania wam co się stało.
Dodajmy że Plichta żebyśmy wiedzieli że pieniądze się naprawdę wypłaciły.
Dodałem również prosty widok w którym na metodzie post zabieramy walił.
Z danych które przesłano użytkownik pobieramy.
To bardzo uprości sytuację i mam tylko jedno konto pobieramy obiekt tego
konta i próbujemy tę kwotę którą podał użytkownik wypłacić.
Sprawdzimy w panelu administratora.
Mam tutaj konto na którym jest zero dolarów więc postawimy 2 dolary.
Przejdźmy do MNI.
Mamy adres mamy walił spróbujmy wypłacić
wypisuje się stan który został do wypłacenia czyli podejrzewamy.
Skąd balans.
Wszystko działa jak jeszcze kwitnie raz mamy zero klikamy jeszcze raz dostajemy.
Błąd 400 brak środków na koncie.
Mam tutaj również prostą realizację parametru wejściowego i właśnie mamy
obsłużonych ten wyjątek z pieniędzmi które nam nie wystarczają na wypłatę.
Czyli teoretycznie wszystko działa idealnie ale pokażę wam jak oszukać.
Postawimy ponownie stan konta na dwa dolary.
I uruchomimy terminal.
Chciałam żebyście widzieli w rogach.
Systemu co się dzieje i pokażę wam skrypt skrypt nazwałem Rob The Bank.
I za pomocą biblioteki Request będzie on
wysyłał Request równolegle pod nasz adres drogę z parametrem Value 1 ci będzie
wypłacał po jednym dolarze jednocześnie z kilku questów.
Będzie to można powiedzieć trochę atak na naszą stronę.
I spróbujmy uruchomić ten skrypt.
Przypominam mamy tylko 2 dolary czyli
powinniśmy dwa razy zobaczyć informacje o wypłaconych środkach i
trzy razy w przypadku pięciu questów które tu wyślemy ponieważ
tutaj 5 questów powiedzmy trzykrotnie zobaczyć błąd 400.
Dostaliśmy 5 razy setkę zaś za w nogi wypłacono nam wypłacone 2 3 4 5.
A okazało się że płaciliśmy 5 dolarów.
Zajrzymy jeszcze do naszego panelu co się
stało z tym kątem to powinno być minus powinien być.
Okazało się że.
Zareagowali tylko na zmiany jednego dolara i czemu tak się stało.
Dlaczego zamiast minusa mamy raptem zdjęte tylko jednego dolara.
W metodzie drą jednocześnie wyszło kilku
użytkowników jednocześnie wszyscy sprawdzili czy
stan jest wystarczający żeby pobrać tego jednego dolara.
Okazało się że jest.
I wtedy wszyscy przeszli do tego fragmentu.
Wtedy wartość która została przypisana do
stanu konta była po prostu niewłaściwa już straciliśmy integralność danych.
I zostało to zapisane zostało w limitowane.
I powiem Wam szczerze że ten problem jest niemal wszędzie.
Popatrzcie sobie na sklepy z
ubraniami na zwykłe sklepy na pizzerii gdzie są do użytku kody rabatowe.
Dajmy na to na sto procent zamówienia.
Jeżeli programista nie zadbał żeby
zabezpieczyć akurat ten fragment kodu ten który jest wrażliwy to będziemy w stanie
na jednym kodzie rabatowe zakupić wiele razy dany produkt.
Pokażę wam teraz jak to zabezpieczyć.
Ogólnie rozwiązaniem tego problemu jest jakaś informacja dla naszej strony że w
tym momencie ktoś sprawdza to konto żebyśmy w tym momencie zablokowali.
I jeżeli.
W tym momencie kiedy mamy porównanie
stanu konta byśmy zweryfikować że ktoś już jest w tym miejscu byliśmy bylibyśmy w
stanie poczekać do momentu aż ten ktoś z tego miejsca
się przeniesie gdzieś indziej czyli coś na zasadzie takiego lokalu i zrobimy.
Na razie sposobem bazą do nowym jest taka metoda Select for update.
Tylko pamiętajcie że ona jest dostępna na
niektórych bazach danych nie jest dostępne na rajdzie.
Dlatego my oferujemy teraz grę.
Aby zabezpieczyć metodę drą.
Trochę ją zmienimy.
Zamiast zwykłej metody użyjemy klasy metod.
W związku z tym musimy pierwszy parametr
zamienić na klasę i dodamy jeszcze przekażemy eKonto III
żebyśmy wiedzieli które konto będziemy modyfikować.
W tym momencie całą metodę musimy.
Włożyć w kontekst menedżer.
Transakcji.
Za chwilę wytłumaczę jaka jest tego przyczyna.
I to jest najważniejsze.
Musimy w tym momencie włączyć lokal na konkretne konto.
Robimy to za pomocą.
Metody Select for update.
I pobieramy jeszcze it out it.
W tym momencie dopóki jesteśmy w tej transakcji jeżeli wejdzie następna osoba
to ona będzie musiała poczekać aż zostanie zwolniona.
Blokada dla tego konta.
Sobie jeszcze ramy ekonomii i po zmieniamy
selfie ponieważ nam się to nieco zmieniło na.
Dobrze musimy jeszcze zmienić wywołanie
widoku ponieważ nie jest to już w druku na metodzie tylko tej klasy metod.
Myślę że możemy wyświetlić stan konta po staremu.
Natomiast.
Odrą zrobił w ten sposób jak chart hoduje to idę.
Ale nie jest to raczej w Dover rozwiązanie na produkcję.
Sprawdzimy czy to pomogło ustalimy ponownie dwa dolary.
Sprawdź może na nim są znicze.
Wszystko zapisałem poprawnie i są mi po staremu.
Teraz ponownie ustawić stan i.
Zobaczmy trochę.
Słynna logika.
Działa zobaczymy jeszcze potwierdzamy
że wypłacono tylko dwa razy potwierdzamy sobie stan konta mamy zero i jest OK.
Jesteśmy uratowani nie będzie niewłaściwych wyników.
Ten problem bardzo często też się pojawia jeśli macie biletowe dane wejścia na jakiś
spektakl wydarzenie koncert cokolwiek i jest dostępnych 100 biletów które
rozchodzą się w minutę wtedy bardzo dużo użytkowników.
Jeżeli wyślemy głos w tym samym momencie jeżeli macie mocny serwer to jesteście w
stanie sprzedać więcej biletów niż jest miejsc.
Dobrze to jest metoda zabezpieczenia tego na poziomie bazy danych.
Jeżeli korzystamy z Kesha a konkretniej z
średnica Regis oferuje też własny look który jest bardzo wygodny
i wtedy możemy zabezpieczyć stronę nawet jeżeli korzystamy z deski glajta.
Musimy zamienić transakcję na tłumik na coś.
Lok.
Popieramy Crash z gangu.
Koszykarz wam pokaże jak wygląda import.
I.
W parametr nie podajemy
jaki chcemy jak chcemy nazwać klucz który będzie tym naszym blokiem.
W tym przypadku może.
Damy po prostu account podkreślił I could it.
Nie potrzebujemy już Select for update starcie sam Get.
Obszar.
Stawiam dolary.
Uruchomi 1:0 po staremu.
I uruchom skrypt.
To co prawda nie jest po kolei tak jak
wcześniej tak ładnie ale ponownie widzimy że dostaliśmy dwa razy 2 setkę czyli dwa
razy zostały wypłacone pieniądze i trzy razy pojawia się 4 setka.
Osobiście uważam że rozwiązanie z KSM jest trochę wygodniejsze ponieważ nie musimy.
Zastanawiać się jaką dokładnie jaki wiersz
dokładnie trzeba pobrać żeby zablokować wywoływanie.
Czasem jest to dość uciążliwe że nie mamy
tak bezpośredniej jednego obiektu na którym chcemy operować.