Comment effectuer les demandes HTTP avec Python - Partie 2 - La bibliothèque des demandes
- 557
- 142
- Clara Nguyen
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
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…
- « Comment effectuer les demandes HTTP avec Python - Partie 1 La bibliothèque standard
- Comment effectuer des demandes HTTP avec Python »