Comment effectuer les demandes HTTP avec Python - Partie 2 - La bibliothèque des demandes

Comment effectuer les demandes HTTP avec Python - Partie 2 - La bibliothèque des demandes

Dans l'article précédent, nous avons vu comment effectuer des demandes HTTP de base en utilisant la bibliothèque standard Python3. Lorsque les demandes deviennent plus complexes, ou que nous voulons simplement utiliser moins de code, et que cela ne nous dérange pas d'ajouter une dépendance à notre projet, il est possible (et parfois même recommandé) d'utiliser l'extérieur demandes module. La bibliothèque, qui a adopté la devise «HTTP pour les humains», sera au centre de cet article.

Dans ce tutoriel, vous apprendrez:

  • Comment effectuer des demandes HTTP avec Python3 et la bibliothèque «Demandes»
  • Comment gérer les réponses du serveur
  • Comment travailler avec les sessions


Demandes HTTP avec Python - PT. II: La bibliothèque des demandes

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant du SO
Logiciel Python3 et la bibliothèque «Demandes»
Autre Connaissance des concepts de base de la programmation orientée objet et de Python
Conventions # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier

Effectuer des demandes avec la bibliothèque «Demandes»

Dans la première partie de cette série, nous avons effectué des demandes HTTP de base en utilisant uniquement la bibliothèque standard. Lorsque les demandes deviennent plus complexes, par exemple lorsque nous devons préserver les cookies entre une demande et une autre, nous pouvons utiliser le demandes Bibliothèque externe, qui simplifie notre travail, effectuant de nombreuses opérations sous le capot pour nous. Étant donné que la bibliothèque n'est pas incluse dans une installation par défaut de Python3, nous devons l'installer sur notre système avant de pouvoir l'utiliser. Une méthode indépendante de la distribution pour accomplir la tâche consiste à utiliser pépin, Le gestionnaire de packages Python:

Demandes d'installation de Pip3 $ - User


Maintenant que nous avons installé la bibliothèque, voyons quelques exemples de comment l'utiliser.

Effectuer une demande de GET

N'oubliez pas la demande que nous avons faite en utilisant les API de la NASA, pour récupérer «l'image du jour» pour une date spécifique? Construire et envoyer la même demande avec le demandes La bibliothèque ne nécessite qu'une seule ligne de code:

>>> les demandes d'importation >>> réponse = demandes.get ("https: // api.NASA.Gov / Planetary / apod ", params = " api_key ":" Demo_key "," Date ":" 2019-04-11 ") 
Copie

Nous avons passé l'URL et les paramètres de requête (toujours en tant que dictionnaire), respectivement comme le premier et le deuxième argument du obtenir fonction. Que renvoie cette fonction? Il renvoie une instance du demandes.des modèles.Réponse classe. Interagir avec les instances de cette classe est très facile. Voulons-nous récupérer le contenu codé de JSON de la réponse? Facile! Nous avons juste besoin d'appeler le json Méthode de l'objet:

>>> Réponse.JSON () 'Date': '2019-04-11', 'Explication': `` À quoi ressemble un trou noir? Pour le découvrir, les télescopes radio '' de autour de la Terre ont coordonné les observations de «trous noirs avec les plus grands horizons d'événements connus sur le ' ... `` Vicine immédiate du trou noir au centre de notre galaxie de la '' '' '.',' hdurl ':' https: // apod.NASA.Gov / apod / Image / 1904 / M87BH_EHT_2629.jpg ',' media_type ':' image ',' service_version ':' v1 ',' title ':' première image à l'échelle de l'horizon d'un trou noir ',' url ':' https: // apod.NASA.Gov / apod / image / 1904 / m87bh_eht_960.jpg ' 
Copie

Voulons-nous obtenir la réponse du serveur en tant que chaîne? Tout ce que nous avons à faire est d'accéder au texte propriété:

réponse.texte

De la même manière que nous pouvons accéder au raison, status_code et têtes de la demande. Il nous suffit d'accéder aux propriétés respectives:

>>> Réponse.Raison 'OK' >>> Réponse.Status_code 200 >>> Réponse.En-têtes 'Server': 'Openresty', 'Date': 'Thu, 18 avril 2019 10:46:26 GMT', 'Content-Type': 'Application / Json', 'Transfer-Encoding': 'Chunked', «Connexion»: «Keep-Alive», «Vary»: «Accept-Encoding», «X-Ratelimit-Limit»: «40», «X-Ratelimit-Remaining»: «39», «Via»: «1.1 vegur, http / 1.1 api-ubrella (ApachetrafficServer [CMSSF]) ',' Age ':' 0 ',' X-Cache ':' Miss ',' Access-Control-Allow-Origin ':' * ',', "Strict-Transport-Security ':' Max-Age = 31536000; Preload ',' Content-Encoding ':' gzip ' 
Copie

Télécharger un fichier

Le téléchargement d'un fichier est également très facile. Tout d'abord, nous devons utiliser le flux paramètre du obtenir fonction. Par défaut, ce paramètre est défini sur FAUX, Et cela signifie que le corps de la réponse sera téléchargé immédiatement. Puisque nous voulons peut-être télécharger un grand fichier, nous voulons le définir sur Vrai: De cette façon, seuls les en-têtes de la réponse seront immédiatement téléchargés et la connexion restera ouverte afin que nous puissions le traiter davantage comme nous le voulons:



>>> DERNITE_KERNEL_TARBALL = "https: // cdn.noyau.org / pub / linux / noyau / v5.x / linux-5.0.7.le goudron.xz ">>> avec les demandes.get (leterst_kernel_tarball, stream = true) comme réponse: ... avec Open ("Dernier-nage.le goudron.XZ "," WB ") comme tarball: ... pour le morceau en réponse.iter_content (16384): ... tarball.écrire (morceau) 
Copie

Le code est similaire à son homologue standard de la bibliothèque: la chose qui a changé est l'utilisation du iter_content Méthode de l'objet de réponse. Dans l'exemple précédent, nous avons opéré à l'intérieur d'une boucle de temps, que nous n'avons interrompues que lorsque le contenu de la réponse a été consommé. En utilisant cette méthode, nous pouvons écrire dans le fichier de destination d'une manière plus élégante, car nous pouvons itérer le contenu de la réponse. Le iter_content La méthode accepte l'argument facultatif chunk_size, un entier indiquant la taille du morceau en octets (les données à lire en mémoire à chaque itération).

Envoi de données codées par formulaire ou JSON dans une demande

L'envoi de données codées par formulaire (par exemple dans une demande de poste) avec la bibliothèque «Demandes», nécessite moins de code que la même opération effectuée uniquement à l'aide de la bibliothèque standard:

>>> request_data =  ... "variable1": "value1", ... "variable2": "value2" ... >>> Réponse = demande.Post ("https: // httpbin.org / post ", data = request_data) 
Copie

Pour passer les mêmes données, mais comme JSON:

réponse = demandes.Post ("https: // httpbin.org / post ", json = request_data)

En utilisant le json Paramètre de la fonction, nous n'avons même pas à nous soucier de l'encodage de la chaîne en utilisant json.décharge: il sera fait pour une utilisation sous le capot.

Téléchargement d'un fichier

Le téléchargement d'un fichier à l'aide de la bibliothèque standard peut être une tâche très fastidieuse, mais il est très facile en utilisant le demandes bibliothèque. Dites que nous voulons télécharger une image:

>>> Réponse = Demandes.poste( ... "https: // httpbin.org / post ", fichiers = 'file': ouvrir ('nasa_black_hole.png ',' rb ')) 
Copie

Code court impressionnant! Nous avons effectué un poste demande, cette fois en utilisant le des dossiers argument. Cet argument doit être un dictionnaire où la clé est le «nom» de champ et la valeur est un objet de fichier, dans ce cas renvoyé par le ouvrir fonction.

Qu'en est-il des autres verbes http? Chacun d'eux est utilisé avec la fonction nommée en conséquence: mettre, supprimer, diriger ou options. Tous peuvent être utilisés avec fondamentalement la même interface que celles que nous avons vues avant.

Travailler avec des sessions

Le demandes La bibliothèque nous permet d'utiliser séances: Lorsque les demandes sont envoyées à partir d'un contexte de session, les cookies sont conservés entre une demande et une autre. C'est la façon recommandée d'effectuer plusieurs demandes au même hôte, car même la même TCP La connexion sera réutilisée. Voyons comment créer une session et envoyer une demande avec lui:

>>> Session = Demandes.Session () >>> réponse = session.get ("https: // httpbin.org / cookies / set?LastName = Skywalker ") 
Copie

Nous avons créé une instance du demandes.Session classe, et, au lieu d'exécuter une demande en soi, comme nous l'avons fait dans des exemples précédents, nous avons utilisé la méthode nommée d'après le verbe HTTP (((obtenir dans ce cas) qui est utilisé de la même manière. L'URL de demande, cette fois, était http: // httpbin.org / cookies / set, un point de terminaison qui nous a permis de définir les paramètres des cookies que nous envoyons dans la chaîne de requête. L'appel que nous avons passé a défini un cookie qui est maintenant stocké dans la session, et sera utilisé dans toutes les demandes envoyées à partir du session contexte. Pour répertorier tous les cookies associés à une session, nous pouvons accéder au biscuits propriété, qui est une instance du demandes.biscuits.Requêtes cookiejar ' classe:

>>> Session.biscuits  >>> # Accédez aux touches cookies ...session.biscuits.keys () ['lastname'] >>> >>> # Accédez aux valeurs des cookies ...session.biscuits.valeurs () ['skywalker'] >>> >>> # La méthode Iterkeys renvoie un itérateur de noms de cookies ...session.biscuits.iterkeys ()  >>> # La méthode iTervalues ​​fait de même mais pour les valeurs ...session.biscuits.iTervalues ​​()  
Copie

Pour nettoyer les cookies stockés dans la session, nous pouvons utiliser le clair méthode:

>>> Session.biscuits.Clear () >>> Session.biscuits  
Copie

Créer un objet de demande

Jusqu'à présent, nous venons d'utiliser des fonctions comme obtenir, poste ou mettre qui créent et envoient essentiellement des demandes «à la volée». Il y a des cas dans lesquels nous voulons construire un Demande objet mais nous ne voulons pas l'envoyer immédiatement. Voici comment nous pouvons le faire:

>>> demande = demandes.Demande ("get", "https: // httpbin.org / get ")

Le premier argument du Demande Le constructeur est le verbe que nous voulons utiliser et le second, l'URL de destination. Les mêmes paramètres que nous utilisons lorsque nous envoyons une demande directement peut être utilisé: têtes, paramètres, données, json et des dossiers. Une fois que nous avons créé un Demande Nous devons le «préparer» avant de pouvoir l'envoyer:



>>> Session = Demandes.Session () >>> demande = demande.Demande ("get", "https: // httpbin.org / get ") >>> préparé_request = session.Prépare_Request (demande) >>> Réponse = session.envoyer (préparé_request) 
Copie

Nous pourrions également préparer un Demande en utilisant le préparer Méthode de la Demande Objet lui-même, au lieu d'appeler session.préparent_request, Mais dans ce cas, la demande perdrait les avantages de faire partie de la session.

Augmenter une exception lorsque le code d'état de la réponse n'est pas 200

Le code d'état renvoyé par un serveur lorsqu'une demande est réussie est 200. Lorsqu'une erreur se produit, par exemple lorsqu'une ressource n'est pas trouvée ou lorsque nous ne sommes pas autorisés à y accéder, d'autres codes sont retournés (dans ce cas 404 et 403 respectivement). Lorsque cela se produit et que nous voulons que notre code soulève une exception, nous devons appeler le relance_for_status Méthode de la demandes.des modèles.Réponse objet. Voyons comment le code se comporte différemment lorsque nous l'utilisons. Nous envoyons une demande de poste à un point de terminaison qui accepte uniquement le verbe Get:

>>> Réponse = Demandes.Post ('https: // httpbin.org / get ') >>> réponse.Status_code 405 >>> Réponse.Raison «Méthode non autorisée» 
Copie

Comme prévu, puisque nous avons utilisé le mauvais verbe HTTP, le code d'état de la réponse était 405, Et la «raison» correspondante est MÉTHODE NON AUTORISÉE, Cependant, aucune exception n'a été soulevée. Pour laisser une mauvaise demande soulever un exception Nous devons appeler le relance_for_status Méthode après avoir envoyé la demande:

>>> Réponse = Demandes.Post ('https: // httpbin.org / get ') >>> réponse.race_for_status () traceback (dernier appel dernier): fichier "", ligne 1, dans le fichier "/ usr / lib / python3.7 / PACKAGES DE SITE / DEMANDES / MODÈLES.py ", ligne 940, dans reseuil_for_status relevant httperror (http_error_msg, réponse = self).des exceptions.Httperror: 405 Erreur du client: Méthode non autorisée pour l'URL: https: // httpbin.org / get 
Copie

Puisque nous avons appelé relance_for_status, Cette fois, la demande a soulevé un demandes.des exceptions.Erreur HTTP exception.

Conclusions

Dans cet article, le deuxième des séries sur la demande de HTTP avec Python, nous nous sommes concentrés
sur l'utilisation de l'extérieur demandes bibliothèque, qui nous permettons de répondre à la fois simple et complexe
Dans quelques lignes de code. Veux en savoir plus à ce sujet? La documentation officielle n'est qu'à un clic!

Tutoriels Linux connexes:

  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Comment configurer un serveur OpenVPN sur Ubuntu 20.04
  • Masterring Bash Script Loops
  • Comment travailler avec l'API WooCommerce REST avec Python
  • Choses à installer sur Ubuntu 20.04
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Boucles imbriquées dans les scripts bash
  • Comment créer une application Tkinter à l'aide d'un objet orienté…
  • Système linux hung? Comment s'échapper vers la ligne de commande et…
  • Comment lancer des processus externes avec Python et le…