Cómo realizar solicitudes HTTP con Python - Parte 2 - La biblioteca de solicitudes
- 4073
- 601
- Hugo Vera
En el artículo anterior vimos cómo realizar solicitudes HTTP básicas utilizando la biblioteca estándar Python3. Cuando las solicitudes se vuelven más complejas, o solo queremos usar menos código, y no nos importa agregar una dependencia a nuestro proyecto, es posible (y a veces incluso recomendado) usar el externo peticiones
módulo. La biblioteca, que adoptó el lema "http para humanos", será el foco de este artículo.
En este tutorial aprenderás:
- Cómo realizar solicitudes HTTP con Python3 y la biblioteca de 'solicitudes'
- Cómo administrar las respuestas del servidor
- Cómo trabajar con sesiones
Solicitudes HTTP con Python - PT. II: la biblioteca de solicitudes
Requisitos y convenciones de software utilizados
Categoría | Requisitos, convenciones o versión de software utilizada |
---|---|
Sistema | INDEPENDO DEL OS |
Software | Python3 y la biblioteca "solicitudes" |
Otro | Conocimiento de los conceptos básicos de programación orientada a objetos y Python |
Convenciones | # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominiops - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado |
Realizar solicitudes con la biblioteca "Solicitudes"
En la primera parte de esta serie, realizamos solicitudes HTTP básicas utilizando solo la biblioteca estándar. Cuando las solicitudes se vuelven más complejas, por ejemplo, cuando necesitamos preservar las cookies entre una solicitud y otra, podemos usar el peticiones
Biblioteca externa, que simplifica nuestro trabajo, realizando muchas operaciones debajo del capó para nosotros. Dado que la biblioteca no está incluida en una instalación predeterminada de Python3, debemos instalarla en nuestro sistema antes de poder usarla. Un método independiente de la distribución para lograr la tarea es usar pepita
, The Python Package Manager:
$ PIP3 Solicitudes de instalación -Usor
Ahora que instalamos la biblioteca, veamos algunos ejemplos de cómo usarla.
Realizar una solicitud GET
Recuerde la solicitud que hicimos con las API de la NASA, para recuperar la "imagen del día" para una fecha específica? Construir y enviar la misma solicitud con el peticiones
La biblioteca requiere solo una línea de código:
>>> solicitudes de importación >>> respuesta = solicitudes.Get ("https: // API.NASA.Gov/Planetary/Apod ", Params = " API_KEY ":" Demo_Key "," Date ":" 2019-04-11 ")
Copiar Pasamos la URL y los parámetros de consulta (aún como un diccionario), respectivamente como el primer y segundo argumento del conseguir
función. ¿Qué devuelve esta función?? Devuelve una instancia del peticiones.modelos.Respuesta
clase. Interactuar con instancias de esta clase es muy fácil. ¿Queremos recuperar el contenido codificado por JSON de la respuesta?? Fácil! Solo necesitamos llamar al json
Método del objeto:
>>> Respuesta.json () 'date': '2019-04-11', 'explicación': '¿Cómo se ve un agujero negro?? Para averiguarlo, los telescopios de radio '' de las observaciones coordinadas de la Tierra de '' agujeros negros con los horizontes de eventos más grandes conocidos en el ' ... 'Vecindad inmediata del agujero negro en el centro de nuestra' 'Galaxia de la Vía Láctea.',' hdurl ':' https: // apod.NASA.Gov/Apod/Image/1904/M87BH_EHT_2629.jpg ',' Media_Type ':' Image ',' Service_Version ':' V1 ',' Title ':' First Horizon-Scale de un agujero negro ',' url ':' https: // apod.NASA.Gov/Apod/Image/1904/M87BH_EHT_960.jpg '
Copiar ¿Queremos obtener la respuesta del servidor como una cadena?? Todo lo que tenemos que hacer es acceder al texto
propiedad:
respuesta.texto
De la misma manera podemos acceder a la razón
, código de estado
y encabezado
de la solicitud. Solo tenemos que acceder a las propiedades respectivas:
>>> Respuesta.Razón 'OK' >>> Respuesta.status_code 200 >>> respuesta.encabezados 'servidor': 'OpenResty', 'Date': 'Thu, 18 de abril de 2019 10:46:26 GMT', 'Content-type': 'Application/JSson', 'Transfer-Engoding': 'Chunked', 'Connection': 'Keep-Alive', 'Vary': 'Aceptar-Engoding', 'X-ratelimit-limit': '40', 'X-ratelimit-relein': '39', 'vía': 1.1 Vegur, http/1.1 api-umbrella (apachetrafficserver [cmssf]) ',' edad ':' 0 ',' x-cache ':' fish ',' access-confontrol-allow-origin ':'*',' Strict-transport-Security ':' Max-Age = 31536000; precarga ',' codificación de contenido ':' gzip '
Copiar Descargar un archivo
Descargar un archivo también es muy fácil. En primer lugar, tenemos que usar el arroyo
Parámetro del conseguir
función. Por defecto, este parámetro se establece en FALSO
, y esto significa que el cuerpo de la respuesta se descargará a la vez. Como es posible que deseemos descargar un archivo grande, queremos configurarlo en Verdadero
: De esta manera, solo los encabezados de la respuesta se descargarán inmediatamente y la conexión permanecerá abierta para que podamos procesarlo como queramos:
>>> ortat_kernel_tarball = "https: // cdn.núcleo.org/pub/linux/kernel/v5.X/Linux-5.0.7.alquitrán.xz ">>> con solicitudes.get (ortat_kernel_tarball, stream = true) como respuesta: ... con Open ("Último kernel.alquitrán.xz "," wb ") como tarball: ... para fragmento en respuesta.iter_content (16384): ... tarball.Escribir (trozo)
Copiar El código es similar a su contraparte de la biblioteca estándar: lo que cambió es el uso del iter_content
Método del objeto de respuesta. En un ejemplo anterior, operamos dentro de un bucle de tiempo, que interrumpimos solo cuando se consumió el contenido de la respuesta. Usando este método, podemos escribir en el archivo de destino de una manera más elegante, ya que podemos iterar en el contenido de la respuesta. El iter_content
El método acepta el argumento opcional tamaño de porción
, un entero
Indicando el tamaño de la fragmentación en bytes (los datos a leer en la memoria en cada iteración).
Enviar datos codificados por formulario o JSON en una solicitud
El envío de datos codificados por formulario (por ejemplo en una solicitud de publicación) con la biblioteca "Solicitudes", requiere menos código que la misma operación realizada solo utilizando la biblioteca estándar:
>>> request_data = ... "Variable1": "Value1", ... "Variable2": "Value2" ... >>> respuesta = solicitudes.post ("https: // httpbin.org/post ", data = request_data)
Copiar Para pasar los mismos datos, pero como JSON:
respuesta = solicitudes.post ("https: // httpbin.org/post ", json = request_data)
Mediante el uso del json
Parámetro de la función, ni siquiera tenemos que preocuparnos por codificar la cadena usando json.deshecho
: se hará para usar debajo del capó.
Cargar un archivo
Cargar un archivo usando la biblioteca estándar puede ser una tarea muy tediosa, pero es muy fácil usar el peticiones
biblioteca. Digamos que queremos subir una imagen:
>>> respuesta = solicitudes.correo( ... "https: // httpbin.org/post ", archivos = 'file': open ('nasa_black_hole.png ',' rb '))
Copiar Código impresionante! Realizamos un correo
Solicitud, esta vez usando el archivos
argumento. Este argumento debe ser un diccionario en el que la clave sea el "nombre" del campo y el valor es un objeto de archivo, en este caso devuelto por el abierto
función.
¿Qué pasa con los otros verbos HTTP?? Cada uno de ellos se usa con la función de consecuencia con nombre: poner
, borrar
, cabeza
o opción
. Todos ellos se pueden usar con básicamente la misma interfaz que las que vimos antes.
Trabajando con sesiones
El peticiones
La biblioteca nos permite usar sesiones
: Cuando se envían solicitudes desde un contexto de sesión, las cookies se conservan entre una solicitud y otra. Esta es la forma recomendada de realizar múltiples solicitudes al mismo host, ya que incluso lo mismo TCP
La conexión se reutilizará. Veamos cómo crear una sesión y enviar una solicitud con ella:
>>> sesión = solicitudes.Sesión () >>> respuesta = sesión.Get ("https: // httpbin.org/cookies/set?LastName = Skywalker ")
Copiar Creamos una instancia del peticiones.Sesión
clase, y, en lugar de ejecutar una solicitud por sí misma, como lo hicimos en ejemplos anteriores, utilizamos el método que lleva el nombre del verbo http, ((conseguir
en este caso) que se usa de la misma manera. La url de solicitud, esta vez, fue http: // httpbin.org/cookies/set, un punto final que nos permite establecer los parámetros de cookie que enviamos a la cadena de consulta. La llamada que hicimos estableció una cookie que ahora se almacena en la sesión y se utilizará en todas las solicitudes enviadas desde el sesión
contexto. Para enumerar todas las cookies asociadas con una sesión, podemos acceder al galletas
propiedad, que es una instancia del peticiones.galletas.Requestscookiejar '
clase:
>>> Sesión.galletas >>> # Acceda a las teclas de las cookies ...sesión.galletas.Keys () ['LastName'] >>> >>> # Acceda a los valores de las cookies ...sesión.galletas.valores () ['Skywalker'] >>> >>> # El método IterKeys devuelve un iterador de nombres de cookies ...sesión.galletas.iterkeys () >>> # El método de Itervalues hace lo mismo pero para los valores ...sesión.galletas.Itervalues ()
Copiar Para limpiar las cookies almacenadas en la sesión, podemos usar el claro
método:
>>> Sesión.galletas.Clear () >>> Sesión.galletas
Copiar Crear un objeto de solicitud
Hasta ahora acabamos de usar funciones como conseguir
, correo
o poner
que básicamente crea y envía solicitudes "sobre la marcha". Hay casos en los que queremos construir un Pedido
objeto pero no queremos enviarlo de inmediato. Así es como podemos hacerlo:
>>> solicitud = solicitudes.Solicitar ("Get", "https: // httpbin.org/get ")
El primer argumento del Pedido
El constructor es el verbo que queremos usar y el segundo, la URL de destino. Se pueden usar los mismos parámetros que usamos cuando enviamos una solicitud directamente: encabezado
, parámetros
, datos
, json
y archivos
. Una vez que creamos un Pedido
Debemos "prepararlo" antes de poder enviarlo:
>>> sesión = solicitudes.Sesión () >>> solicitud = solicitudes.Solicitar ("Get", "https: // httpbin.org/get ") >>> preparado_request = sesión.prepare_request (solicitud) >>> respuesta = sesión.enviar (preparado_request)
Copiar También podríamos preparar un Pedido
utilizando el preparar
método del Pedido
objeto en sí, en lugar de llamar sesión.preparar_request
, Pero en este caso, la solicitud perdería las ventajas de ser parte de la sesión.
Plantear una excepción cuando el código de estado de respuesta no es 200
El código de estado devuelto por un servidor cuando una solicitud es exitosa es 200
. Cuando ocurre algún error, por ejemplo, cuando no se encuentra un recurso o cuando no estamos autorizados para acceder a él, se devuelven otros códigos (en este caso 404 y 403 respectivamente). Cuando esto sucede y queremos que nuestro código plantee una excepción, debemos llamar al Raise_for_status
método del peticiones.modelos.Respuesta
objeto. Veamos cómo se comporta el código de manera diferente cuando lo usamos. Enviamos una solicitud de publicación a un punto final que acepta solo el verbo Get:
>>> respuesta = solicitudes.post ('https: // httpbin.org/get ') >>> respuesta.status_code 405 >>> respuesta.Razón 'Método no permitido'
Copiar Como se esperaba, dado que usamos el verbo HTTP incorrecto, el código de estado de respuesta fue 405
, y la "razón" correspondiente es MÉTODO NO PERMITIDO
, Sin embargo, no se planteó ninguna excepción. Para dejar que una mala solicitud plantee un excepción
debemos llamar al Raise_for_status
método después de enviar la solicitud:
>>> respuesta = solicitudes.post ('https: // httpbin.org/get ') >>> respuesta.rais_for_status () traza (la última llamada reciente): archivo "", línea 1, en el archivo "/usr/lib/python3.7/Packages de sitio/solicitudes/modelos.py ", línea 940, en Rais_for_status Raise Httperror (http_error_msg, respuesta = self) solicitudes.excepciones.Httperror: 405 Error del cliente: método no permitido para la URL: https: // httpbin.org/get
Copiar Desde que llamamos Raise_for_status
, Esta vez la solicitud planteó un peticiones.excepciones.Error HTTP
excepción.
Conclusiones
En este artículo, la segunda de las series sobre realizar una solicitud HTTP con Python, nos centramos
Sobre el uso de lo externo peticiones
Biblioteca, que nos permite realizar solicitudes simples y complejas
En pocas líneas de código. Quieres saber más acerca de eso? La documentación oficial está a solo un clic de distancia!
Tutoriales de Linux relacionados:
- Una introducción a la automatización, herramientas y técnicas de Linux
- Cómo configurar un servidor OpenVPN en Ubuntu 20.04
- Mastering Bash Script Loops
- Cómo trabajar con la API REST de WooCommerce con Python
- Cosas para instalar en Ubuntu 20.04
- Mint 20: Mejor que Ubuntu y Microsoft Windows?
- Bucles anidados en guiones Bash
- Cómo construir una aplicación Tkinter utilizando un objeto orientado ..
- Sistema colgado de Linux? Cómo escapar a la línea de comando y ..
- Cómo iniciar procesos externos con Python y el ..
- « Cómo realizar solicitudes HTTP con Python - Parte 1 La biblioteca estándar
- Cómo realizar solicitudes HTTP con Python »