Jak wykonać żądania HTTP z Python - Część 2 - Biblioteka żądań

Jak wykonać żądania HTTP z Python - Część 2 - Biblioteka żądań

W poprzednim artykule widzieliśmy, jak wykonać podstawowe żądania HTTP za pomocą standardowej biblioteki Python3. Kiedy prośby stają się bardziej złożone lub po prostu chcemy użyć mniej kodu, a my nie mamy nic przeciwko dodaniu zależności do naszego projektu, jest możliwe (a czasem nawet zalecane) używanie zewnętrznego upraszanie moduł. Biblioteka, która przyjęła motto „HTTP dla ludzi”, będzie przedmiotem tego artykułu.

W tym samouczku nauczysz się:

  • Jak wykonywać żądania HTTP z Python3 i biblioteką „żądań”
  • Jak zarządzać odpowiedziami serwerów
  • Jak pracować z sesjami


Prośby HTTP z Python - PT. II: Biblioteka żądań

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
Kategoria Wymagania, konwencje lub wersja oprogramowania
System Niezależny od OS
Oprogramowanie Python3 i biblioteka „żądań”
Inny Znajomość podstawowych pojęć programowania obiektowego i Pythona
Konwencje # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Wykonanie żądań w bibliotece „żądań”

W pierwszej części tej serii przeprowadziliśmy podstawowe żądania HTTP za pomocą tylko standardowej biblioteki. Gdy prośby stają się bardziej złożone, na przykład, gdy musimy zachować pliki cookie między jednym żądaniem a drugim, możemy użyć upraszanie Biblioteka zewnętrzna, która upraszcza naszą pracę, wykonując dla nas wiele operacji pod maską. Ponieważ biblioteka nie jest zawarta w domyślnej instalacji Python3, musimy ją zainstalować w naszym systemie, zanim będziemy mogli jej użyć. Niezależną od rozkładu metodą wykonania zadania jest użycie pypeć, Menedżer pakietów Python:

$ PIP3 Instaluj żądania -Użytkownik


Teraz, gdy zainstalowaliśmy bibliotekę, zobaczmy kilka przykładów, jak z niej korzystać.

Wykonanie żądania GET

Pamiętaj o prośbie, które złożyliśmy za pomocą interfejsów API NASA, aby odzyskać „obraz dnia” dla określonej daty? Budowanie i wysyłanie tego samego żądania z upraszanie Biblioteka wymaga tylko jednego wiersza kodu:

>>> Importuj żądania >>> odpowiedź = żądania.Get ("https: // API.NASA.Gov/Planetary/apod ", params = „ api_key ”:„ demo_key ”,„ data ”:„ 2019-04-11 ”) 
Kopiuj

Przeszliśmy odpowiednio parametry adresu URL i zapytania (wciąż jako słownik) jako pierwszy i drugi argument Dostawać funkcjonować. Co zwraca ta funkcja? Zwraca instancję upraszanie.modele.Odpowiedź klasa. Interakcja z instancjami tej klasy jest bardzo łatwa. Czy chcemy odzyskać zawartość kodowanej JSON odpowiedzi? Łatwy! Musimy tylko zadzwonić JSON Metoda obiektu:

>>> Odpowiedź.JSON () „data”: „2019-04-11”, „Objaśnienie”: „Jak wygląda czarna dziura? Aby dowiedzieć się, radiowe teleskopy z całej Ziemi skoordynowały obserwacje „czarnych dziur z największymi znanymi horyzontami wydarzeń na” ... „Bezpośrednia okolica czarnej dziury pośrodku naszej„ Mlecznej Galaktyki drogi.', „hdurl”:' https: // apod.NASA.Gov/apod/image/1904/m87BH_EHT_2629.jpg ', „media_type”: „image”, „service_version”: „v1”, „tytuł”: „Pierwszy obraz w skali horyzontu czarnej dziury”, „url”: „https: // apod.NASA.Gov/apod/image/1904/m87BH_EHT_960.jpg ' 
Kopiuj

Czy chcemy uzyskać odpowiedź serwera jako ciąg? Wszystko, co musimy zrobić, to uzyskać dostęp do tekst nieruchomość:

odpowiedź.tekst

W ten sam sposób możemy uzyskać dostęp do powód, Kod statusu I nagłówki żądania. Musimy tylko uzyskać dostęp do odpowiednich właściwości:

>>> Odpowiedź.powód „OK” >>> Odpowiedź.Status_code 200 >>> Odpowiedź.Nagłówki „serwer”: „OpenResty”, „data”: „czw, 18 kwietnia 2019 10:46:26 Gmt”, „Content-Type”: „Application/Json”, „Transfer-incoding”: „Chunked”, „Connection”: „Keep-Alive”, „Vary”: „Accept-Encoding”, „X-Ratelimit-Limit”: „40”, „X-Ratelimit-Remining”: „39”, „via”: „1 1.1 Vegur, HTTP/1.1 API-UMBRELLA (APACHETRAFFICSERVER [CMSSF]) ”,„ Age ”:„ 0 ”,„ X-Cache ”:„ Miss ”,„ Access-Control-Aligin ”:„*”,„ Strict-Transport-Security Burity „:” Max-Age = 31536000; wstępne ładowanie ”,„ Content-Incoding ”:„ gzip ” 
Kopiuj

Pobieranie pliku

Pobieranie pliku jest również bardzo łatwe. Przede wszystkim musimy użyć strumień parametr Dostawać funkcjonować. Domyślnie ten parametr jest ustawiony na FAŁSZ, A to oznacza, że ​​ciało odpowiedzi zostanie pobrane jednocześnie. Ponieważ możemy chcieć pobrać duży plik, chcemy go ustawić PRAWDA: W ten sposób tylko nagłówki odpowiedzi zostaną natychmiast pobrane, a połączenie pozostanie otwarte, abyśmy mogli dalej je przetworzyć, jak chcemy:



>>> najnowszy_kernel_tarball = "https: // cdn.jądro.org/pub/linux/jądro/v5.X/Linux-5.0.7.smoła.xz ">>> z żądaniami.get (najnowszy_kernel_tarball, strumień = true) jako odpowiedź: ... z otwartym („najnowszy kernel.smoła.XZ ",„ WB ”) jako Tarball: ... W odpowiedzi w odpowiedzi.ITER_CONTENT (16384): ... Tarball.Napisz (kawałek) 
Kopiuj

Kod jest podobny do standardowego odpowiednika biblioteki: Zmieniona jest użycie ITER_CONTENT Metoda obiektu odpowiedzi. W poprzednim przykładzie działaliśmy w pewnym czasie pętli, którą przerywaliśmy tylko wtedy, gdy treść odpowiedzi została zużyta. Korzystając z tej metody, możemy napisać do pliku docelowego w bardziej elegancki sposób, ponieważ możemy iterować treść odpowiedzi. ITER_CONTENT Metoda akceptuje opcjonalny argument Chunk_Size, jakiś liczba całkowita wskazując rozmiar porcji w bajtach (dane do odczytu w pamięci przy każdej iteracji).

Wysyłanie danych lub JSON na żądanie

Wysyłanie danych zakodowanych przez formę (na przykład w żądaniu pocztowym) z biblioteką „żądania” wymaga mniejszego kodu niż ta sama operacja wykonywana tylko przy użyciu standardowej biblioteki:

>>> request_data =  ... „zmienna1”: „wartość1”, ... „Zmienna2”: „wartość2” ... >>> odpowiedź = żądania.post („https: // httpbin.org/post ", data = request_data) 
Kopiuj

Aby przekazać te same dane, ale jako JSON:

Odpowiedź = żądania.post („https: // httpbin.org/post ", json = request_data)

Za pomocą JSON Parametr funkcji, nie musimy nawet martwić się o kodowanie łańcucha za pomocą JSON.depresja: Zostanie to zrobione do użytku pod maską.

Przesyłanie pliku

Przesłanie pliku za pomocą standardowej biblioteki może być bardzo żmudnym zadaniem, ale bardzo łatwo jest używać upraszanie biblioteka. Powiedzmy, że chcemy przesłać zdjęcie:

>>> Odpowiedź = żądania.post( ... „https: // httpbin.org/post ", pliki = 'plik': Open ('NASA_BLACK_HOLE.png ', „rb”)) 
Kopiuj

Imponująco krótki kod! Wykonaliśmy post żądanie, tym razem za pomocą akta argument. Argument ten musi być słownikiem, w którym kluczem jest pole „nazwa”, a wartość jest obiektem pliku, w tym przypadku zwróconym przez otwarty funkcjonować.

A co z innymi czasownikami HTTP? Każdy z nich jest używany z odpowiednio nazwaną funkcją: umieścić, usuwać, głowa Lub opcje. Wszystkie z nich mogą być używane z zasadniczo tym samym interfejsem, co te, które widzieliśmy wcześniej.

Praca z sesjami

upraszanie Biblioteka pozwala nam korzystać sesje: Gdy prośby są wysyłane z kontekstu sesji, pliki cookie są zachowane między jednym żądaniem a drugim. Jest to zalecany sposób wykonywania wielu żądań do tego samego hosta, ponieważ nawet to samo TCP Połączenie zostanie ponownie wykorzystane. Zobaczmy, jak utworzyć sesję i wyślij z nią żądanie:

>>> session = żądania.Session () >>> response = session.get ("https: // httpbin.org/pliki cookie/zestaw?LastName = Skywalker ”) 
Kopiuj

Stworzyliśmy instancję upraszanie.Sesja klasa i zamiast samodzielnie uruchamiać żądanie, tak jak w poprzednich przykładach, zastosowaliśmy metodę nazwaną na cześć czasownika HTTP (Dostawać w takim przypadku), który jest używany w ten sam sposób. W żądaniu URL tym razem był http: // httpbin.org/pliki cookie/set, punkt końcowy, który pozwala nam ustawić parametry plików cookie, które wysyłamy w ciągu zapytania. Połączenie, które wykonaliśmy, ustawiliśmy plik cookie, który jest teraz przechowywany w sesji i będzie używany we wszystkich żądaniach wysyłanych z sesja kontekst. Aby wymienić wszystkie pliki cookie powiązane z sesją, aby uzyskać dostęp do ciasteczka właściwość, która jest instancją upraszanie.ciasteczka.PoprośSCookiejar ' klasa:

>>> sesja.ciasteczka  >>> # Uzyskaj dostęp do kluczy ciastek ...sesja.ciasteczka.keys () ['lastName'] >>> >>> # Uzyskaj dostęp do wartości plików cookie ...sesja.ciasteczka.wartości () [„Skywalker”] >>> >>> # Metoda iterkeys zwraca iterator nazw plików cookie ...sesja.ciasteczka.iterkeys ()  >>> # Metoda iTervalues ​​robi to samo, ale dla wartości ...sesja.ciasteczka.iTervalues ​​()  
Kopiuj

Aby wyczyścić przechowywane pliki cookie w sesji, możemy użyć jasne metoda:

>>> sesja.ciasteczka.clear () >>> sesja.ciasteczka  
Kopiuj

Utwórz obiekt żądania

Do tej pory po prostu używaliśmy funkcji takich jak Dostawać, post Lub umieścić które w zasadzie tworzą i wysyłają żądania „w locie”. Są przypadki, w których chcemy zbudować Wniosek obiekt, ale nie chcemy go wysyłać natychmiast. Oto jak możemy to zrobić:

>>> żądania = żądania.Żądanie („get”, „https: // httpbin.org/get ”)

Pierwszy argument Wniosek Konstruktor to czasownik, którego chcemy użyć, a drugi, docelowy adres URL. Można użyć tych samych parametrów, których używamy, gdy wysyłamy żądanie: nagłówki, Params, dane, JSON I akta. Po utworzeniu Wniosek Musimy go „przygotować”, zanim będziemy mogli go wysłać:



>>> session = żądania.Session () >>> żądanie = żądania.Żądanie („get”, „https: // httpbin.org/get ") >>> sesja przygotowana_request = sesja.PREPED_REQUEST (żądanie) >>> response = sesja.Wyślij (przygotowany_request) 
Kopiuj

Moglibyśmy również przygotować Wniosek używając przygotowywać Metoda Wniosek obiekt sam, zamiast dzwonić sesja.Przygotuj_request, Ale w tym przypadku wniosek straciłaby zalety bycia częścią sesji.

Podnieś wyjątek, gdy kod stanu odpowiedzi nie ma 200

Kod stanu zwrócony przez serwer, gdy żądanie się powiedzie, jest 200. Kiedy wystąpił jakiś błąd, na przykład, gdy zasób nie zostanie znaleziony lub gdy nie jesteśmy upoważnieni do dostępu, inne kody są zwracane (odpowiednio w tym przypadku 404 i 403). Kiedy to się stanie i chcemy, aby nasz kod podniósł wyjątek, musimy zadzwonić Raise_for_status Metoda upraszanie.modele.Odpowiedź obiekt. Zobaczmy, jak kod zachowuje się inaczej, gdy go używamy. Wysyłamy żądanie pocztowe do punktu końcowego, który akceptuje tylko czasownik GET:

>>> Odpowiedź = żądania.Post ('https: // httpbin.org/get ') >>> odpowiedź.Status_code 405 >>> Odpowiedź.powód „Metoda niedozwolona” 
Kopiuj

Zgodnie z oczekiwaniami, ponieważ użyliśmy niewłaściwego czasownika HTTP, kod stanu odpowiedzi był 405, a odpowiedni „powód” jest NIEDOZWOLONA METODA, Jednak nie został podniesiony żaden wyjątek. Aby zła prośba podniosła wyjątek Musimy zadzwonić Raise_for_status Metoda po wysłaniu żądania:

>>> Odpowiedź = żądania.Post ('https: // httpbin.org/get ') >>> odpowiedź.Raise_for_status () Traceback (najnowsze połączenie ostatnie): File „”, wiersz 1, w pliku ”/usr/lib/Python3.7/pakiety/żądania/modele.py ", wiersz 940, w Raise_For_status Raise Httperror (http_error_msg, response = self) żądania.wyjątki.Httperror: 405 Błąd klienta: Metoda niedozwolona dla URL: https: // httpbin.org/get 
Kopiuj

Odkąd zadzwoniliśmy Raise_for_status, Tym razem prośba o podniesienie upraszanie.wyjątki.Błąd HTTP wyjątek.

Wnioski

W tym artykule, drugi z serii o wykonywaniu żądania HTTP z Pythonem, skupiliśmy się
o użyciu zewnętrznego upraszanie Biblioteka, która pozwala nam wykonywać zarówno proste, jak i złożone żądania
w kilku wierszach kodu. Chcesz dowiedzieć się o tym więcej? Oficjalna dokumentacja jest tylko jednym kliknięciem!

Powiązane samouczki Linux:

  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Jak skonfigurować serwer OpenVPN na Ubuntu 20.04
  • Mastering Bash Script Loops
  • Jak pracować z WooCommerce Rest API z Pythonem
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Zagnieżdżone pętle w skryptach Bash
  • Jak zbudować aplikację Tkinter za pomocą obiektu zorientowanego na…
  • Hung Linux System? Jak uciec do wiersza poleceń i…
  • Jak uruchomić procesy zewnętrzne z Pythonem i…