258
Rozdział 6.
Użycie sekwencji ucieczki w stosunku do surowych danych
Przeglądanie pełnego logu w Twojej aplikacji WWW
Zmiana, której trzeba dokonać w Twoim kodzie, jest wręcz trywialna, ale robi naprawdę dużą różnicę. Dodaj
funkcję
escape
do listy elementów importowanych z modułu
flask
(znajdującej się na początku kodu Twojego
programu), a następnie wywołaj tę funkcję na rzecz łańcucha znakowego zwróconego przez metodę
read
.
from flask import Flask, render_template, request, escape
...
@app.route(‘/viewlog’)
def view_the_log() -> str:
with open(‘vsearch.log’) as log:
contents = log.read()
return escape(contents)
Dodaj to do listy
importowanych
elementów.
Wywołaj funkcję escape,
podając jako jej argument
zwrócony łańcuch znakowy.
Wszystkie dane
zapisane w pliku
logu są teraz
wyświetlane...
...a mechanizm zastępowania
znaków specjalnych również działa
prawidłowo. Mimo to — jeśli mamy
być szczerzy — dane żądań nie
mówią nam zbyt wiele, nieprawdaż?
Zmodyfikuj swój program w taki sposób, aby importował i wywoływał funkcję
escape
, jak zostało to przedstawione
powyżej, a potem zapisz swój kod (aby Twoja aplikacja WWW została przeładowana). Następnie przeładuj
w przeglądarce internetowej stronę wskazywaną przez URL
/viewlog
. Wszystkie dane pochodzące z logu powinny
teraz pojawić się na ekranie. Koniecznie spójrz w źródło HTML, aby potwierdzić, że zastosowane rozwiązanie
działa. Poniżej możesz się przekonać, co zobaczyliśmy, gdy przetestowaliśmy tę wersję naszej aplikacji WWW
za pomocą przeglądarki Chrome.
Jazda próbna
jesteś tutaj�
259
Przechowywanie danych i manipulowanie nimi
Więcej informacji na temat obiektu żądania
Znajdujące się w pliku logu dane dotyczące żądań sieciowych nie są w gruncie rzeczy aż tak
użyteczne. Poniżej możesz znaleźć przykład tego, co jest w tej chwili logowane. Choć każdy
zalogowany wynik jest inny, to każde zalogowane żądanie sieciowe jest
dokładnie takie samo.
<Request ‘http://127.0.0.1:5000/search4’ [POST]> {‘i’, ‘e’}
<Request ‘http://127.0.0.1:5000/search4’ [POST]> {‘i’, ‘e’, ‘a’}
<Request ‘http://127.0.0.1:5000/search4’ [POST]> {‘y’, ‘t’}
Każde zalogowane
żądanie sieciowe
jest takie samo.
Każdy
zalogowany
wynik jest inny.
def log_request(req: ‘flask_request’, res: str) -> None:
with open(‘vsearch.log’, ‘a’) as log:
print(str(dir(req)), res, file=log)
Wywołujemy funkcję dir, podając jej jako argument zmienną req,
w wyniku czego zwracana jest lista, po czym przekształcamy tę
listę w łańcuch znakowy, przekazując ją jako argument funkcji str.
Otrzymany w efekcie tego łańcuch jest następnie zapisywany
w pliku logu wraz z wartością zmiennej res.
Logujemy żądania sieciowe na poziomie obiektu, ale tak naprawdę powinniśmy zaglądać
do
wnętrza żądań i logować pewne dane, które zawierają. Jak przekonałeś się już
wcześniej w tej książce, gdy trzeba dowiedzieć się, co zawiera jakaś rzecz w Pythonie,
należy podać nazwę tej rzeczy jako argument wbudowanej funkcji
dir
. Umożliwia to
wyświetlenie listy metod i atrybutów danego obiektu.
Wprowadźmy niewielką zmianę w funkcji
log_request
, aby logować dane wyjściowe
pochodzące z wywołania funkcji
dir
na rzecz obiektu żądania. Nie jest to wielka zmiana.
Zamiast przekazywać zmienną
req
jako pierwszy argument funkcji
print
, przekażmy
jej rzutowany na łańcuch tekstowy wynik wywołania funkcji
dir(req)
. Oto nowa wersja
funkcji
log_request
, w której wyróżniona została wspomniana zmiana.
Wypróbujmy ten nowy kod logujący, aby przekonać się, co się dzięki niemu zmieni. Wykonaj następujące kroki:
1. Zmień swoją kopię funkcji log_request w taki sposób, aby wyglądała tak jak nasza.
2. Zapisz plik
vsearch4web.py
, aby ponownie uruchomić swoją aplikację WWW.
3. Znajdź i usuń bieżącą wersję pliku
vsearch.log
.
4. Użyj swojej przeglądarki internetowej, aby wykonać trzy nowe wyszukiwania.
5. Zobacz nowo utworzony log, korzystając z URL-a /viewlog.
Przyjrzyj się teraz dokładnie temu, co pojawiło się w oknie Twojej przeglądarki. Czy to, co w tej chwili w nim
widzisz, może Ci w jakiś sposób pomóc?
Ćwiczenie
260
Rozdział 6.
str dir req
Jazda próbna
Poniżej możesz się przekonać, co zobaczyliśmy, gdy wykonaliśmy pięć kroków przedstawionych pod koniec
poprzedniej strony. Korzystaliśmy tu z programu
Chrome
(choć każda przeglądarka pokazuje te same dane).
Wszystko to
wygląda dość
chaotycznie.
Przyjrzyj się jednak
bliżej: tutaj widać
wynik jednego
z przeprowadzonych
wyszukiwań.
Czym to wszystko zatem jest?
Wśród przedstawionych powyżej danych wyjściowych możesz znaleźć zalogowane wyniki działania funkcji wyszukującej
znaki w podanej frazie. Reszta danych to wynik wywołania funkcji
dir
z argumentem będącym obiektem żądania. Jak
widać, każdy z takich obiektów ma mnóstwo metod i atrybutów (będzie ich sporo nawet, gdy zignorujesz wszystkie
dundery
i
wondery). Ewidentnie nie ma sensu logować wszystkich tych atrybutów.
Przyjrzeliśmy się wszystkim tym atrybutom i stwierdziliśmy, że trzy z nich wydają się na tyle istotne, że warto byłoby je
logować. Są to:
req.form
— dane przesłane z formularza HTML aplikacji WWW;
req.remote_addr
— adres IP komputera, na którym działa używana przeglądarka internetowa;
req.user_agent
— tożsamość przeglądarki przesyłającej dane.
Zmieńmy kod funkcji
log_request
w taki sposób, aby logowała tylko te trzy szczególne fragmenty danych, oczywiście
poza wynikami wywołań funkcji
search4letters
.
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.