Escribir una API en Python (con Flask y RapidAPI)



Si está leyendo este artículo, probablemente ya esté familiarizado con las posibilidades que se abren utilizando la API (interfaz de programación de aplicaciones).

Al agregar una de las muchas API abiertas a su aplicación, puede ampliar la funcionalidad de esta aplicación o complementarla con los datos necesarios. Pero, ¿qué sucede si desarrolló una característica única que desea compartir con la comunidad?

La respuesta es simple: necesita crear su propia API .

A pesar de que al principio parece una tarea desalentadora, de hecho, todo es simple. Le mostraremos cómo hacer esto con Python.

Lo que necesitas para comenzar


Para desarrollar la API necesitas:

  • Python 3
  • Frasco : un marco simple y fácil de usar para crear aplicaciones web;
  • Flask-RESTful es una extensión para Flask que le permite desarrollar una API REST rápidamente y con una configuración mínima.

La instalación se realiza mediante el comando:

pip install flask-restful 

Programación intensiva gratuita recomendada para principiantes:
Desarrollo de bot de Telegram en C # - 26 y 28 de agosto. Intensivo gratuito que le permite comprender cómo funcionan los bots asistentes, en las características de trabajar con la API de Telegram y otros matices. Los tres mejores participantes recibirán 30,000 rublos de Skillbox .
Antes de empezar

Vamos a desarrollar una API RESTful con funcionalidad CRUID básica.

Para comprender completamente el problema, veamos los dos términos mencionados anteriormente.

¿Qué es REST?

La API REST (Transferencia de estado representacional) es una API que utiliza solicitudes HTTP para intercambiar datos.

Las API REST deben cumplir ciertos criterios:

  • Arquitectura cliente-servidor: el cliente interactúa con la interfaz de usuario y el servidor interactúa con el backend y el almacén de datos. El cliente y el servidor son independientes, cualquiera de ellos se puede reemplazar por separado del otro.
  • Sin estado: no se almacenan datos del cliente en el servidor. El estado de la sesión se almacena en el lado del cliente.
  • Capacidad de almacenamiento en caché: los clientes pueden almacenar en caché las respuestas del servidor para mejorar el rendimiento general.

¿Qué es un CRUD?

CRUD es un concepto de programación que describe cuatro acciones básicas (crear, leer, actualizar y eliminar).

En la API REST, los tipos de solicitud y los métodos de solicitud son responsables de acciones como publicar, obtener, colocar, eliminar.

Ahora que hemos descubierto los términos básicos, puede comenzar a crear la API.

Desarrollo


Creemos un repositorio de citas sobre inteligencia artificial. La IA es una de las tecnologías de más rápido crecimiento en la actualidad, y Python es una herramienta popular para trabajar con IA.

Con esta API, un desarrollador de Python puede obtener rápidamente información sobre IA e inspirarse en nuevos desarrollos. Si el desarrollador tiene ideas valiosas sobre este tema, podrá agregarlas al repositorio.

Comencemos importando los módulos necesarios y configurando Flask:

 from flask import Flask from flask_restful import Api, Resource, reqparse import random app = Flask(__name__) api = Api(app) 

En este fragmento, Flask, Api y Resource son las clases que necesitamos.

Reqparse es una interfaz de análisis de solicitud de Flask-RESTful ... También necesitará un módulo aleatorio para mostrar una cotización aleatoria.

Ahora crearemos un repositorio de citas AI.

Cada entrada de repositorio contendrá:

  • ID digital
  • nombre del autor de la cita;
  • cita

Dado que este es solo un ejemplo de entrenamiento, guardaremos todas las entradas en una lista de Python. En una aplicación real, probablemente usaríamos una base de datos.

 ai_quotes = [ { "id": 0, "author": "Kevin Kelly", "quote": "The business plans of the next 10,000 startups are easy to forecast: " + "Take X and add AI." }, { "id": 1, "author": "Stephen Hawking", "quote": "The development of full artificial intelligence could " + "spell the end of the human race… " + "It would take off on its own, and re-design " + "itself at an ever increasing rate. " + "Humans, who are limited by slow biological evolution, " + "couldn't compete, and would be superseded." }, { "id": 2, "author": "Claude Shannon", "quote": "I visualize a time when we will be to robots what " + "dogs are to humans, " + "and I'm rooting for the machines." }, { "id": 3, "author": "Elon Musk", "quote": "The pace of progress in artificial intelligence " + "(I'm not referring to narrow AI) " + "is incredibly fast. Unless you have direct " + "exposure to groups like Deepmind, " + "you have no idea how fast — it is growing " + "at a pace close to exponential. " + "The risk of something seriously dangerous " + "happening is in the five-year timeframe." + "10 years at most." }, { "id": 4, "author": "Geoffrey Hinton", "quote": "I have always been convinced that the only way " + "to get artificial intelligence to work " + "is to do the computation in a way similar to the human brain. " + "That is the goal I have been pursuing. We are making progress, " + "though we still have lots to learn about " + "how the brain actually works." }, { "id": 5, "author": "Pedro Domingos", "quote": "People worry that computers will " + "get too smart and take over the world, " + "but the real problem is that they're too stupid " + "and they've already taken over the world." }, { "id": 6, "author": "Alan Turing", "quote": "It seems probable that once the machine thinking " + "method had started, it would not take long " + "to outstrip our feeble powers… " + "They would be able to converse " + "with each other to sharpen their wits. " + "At some stage therefore, we should " + "have to expect the machines to take control." }, { "id": 7, "author": "Ray Kurzweil", "quote": "Artificial intelligence will reach " + "human levels by around 2029. " + "Follow that out further to, say, 2045, " + "we will have multiplied the intelligence, " + "the human biological machine intelligence " + "of our civilization a billion-fold." }, { "id": 8, "author": "Sebastian Thrun", "quote": "Nobody phrases it this way, but I think " + "that artificial intelligence " + "is almost a humanities discipline. It's really an attempt " + "to understand human intelligence and human cognition." }, { "id": 9, "author": "Andrew Ng", "quote": "We're making this analogy that AI is the new electricity." + "Electricity transformed industries: agriculture, " + "transportation, communication, manufacturing." } ] 

Ahora necesitamos crear una Cotización de clase de recurso, que determinará las operaciones de los puntos finales de nuestra API. Deben declararse cuatro métodos dentro de la clase: get, post, put, delete.

Comencemos con el método GET.

Permite obtener una cotización específica especificando su ID o una cotización aleatoria si no se especifica la ID.

 class Quote(Resource): def get(self, id=0): if id == 0: return random.choice(ai_quotes), 200 for quote in ai_quotes: if(quote["id"] == id): return quote, 200 return "Quote not found", 404 

El método GET devuelve una cita aleatoria si la ID contiene un valor predeterminado, es decir Al llamar al método, no se estableció ninguna ID.

Si se especifica, el método busca entre comillas y encuentra uno que contiene la ID especificada. Si no se encuentra nada, se muestra el mensaje "Cita no encontrada, 404".

Recuerde: el método devuelve un estado HTTP de 200 si la solicitud es exitosa y 404 si no se encuentra el registro.

Ahora creemos un método POST para agregar una nueva cita al repositorio

Recibirá el identificador de cada nueva cotización a medida que escribe. Además, POST usará reqparse para analizar los parámetros que irán en el cuerpo de la solicitud (autor y texto de cita).

 def post(self, id): parser = reqparse.RequestParser() parser.add_argument("author") parser.add_argument("quote") params = parser.parse_args() for quote in ai_quotes: if(id == quote["id"]): return f"Quote with id {id} already exists", 400 quote = { "id": int(id), "author": params["author"], "quote": params["quote"] } ai_quotes.append(quote) return quote, 201 

En el código anterior, el método POST aceptó el ID de la cotización. Luego, usando reqparse, obtuvo el autor y una cita de la consulta, almacenándolos en el diccionario de parámetros.

Si ya existe una cotización con el ID especificado, el método muestra el mensaje correspondiente y el código 400.

Si todavía no se ha creado una cotización con la ID especificada, el método crea un nuevo registro con la ID y el autor especificados, así como otros parámetros. Luego agrega una entrada a la lista ai_quotes y devuelve una entrada con una nueva cita junto con el código 201.

Ahora cree un método PUT para modificar una cotización existente en el repositorio.

 def put(self, id): parser = reqparse.RequestParser() parser.add_argument("author") parser.add_argument("quote") params = parser.parse_args() for quote in ai_quotes: if(id == quote["id"]): quote["author"] = params["author"] quote["quote"] = params["quote"] return quote, 200 quote = { "id": id, "author": params["author"], "quote": params["quote"] } ai_quotes.append(quote) return quote, 201 

El método PUT, similar al ejemplo anterior, toma ID y entrada y analiza los parámetros de cotización usando reqparse.

Si existe una cotización con la ID especificada, el método la actualizará con nuevos parámetros y luego mostrará una cotización actualizada con el código 200. Si no hay una cotización con la ID especificada, se creará un nuevo registro con el código 201.

Finalmente, creemos un método DELETE para eliminar una cita que ya no es inspiradora.

 def delete(self, id): global ai_quotes ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id] return f"Quote with id {id} is deleted.", 200 

Este método obtiene el ID de la cita a medida que escribe y actualiza la lista ai_quotes usando una lista común.

Ahora que hemos creado todos los métodos, todo lo que tenemos que hacer es agregar el recurso a la API, establecer la ruta y ejecutar Flask.

 api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>") if __name__ == '__main__': app.run(debug=True) 

¡Nuestro servicio API REST está listo!

A continuación, podemos guardar el código en el archivo app.py ejecutándolo en la consola usando el comando:

 python3 app.py 

Si todo está bien, obtenemos algo como esto:

* Modo de depuración: activado
* Se ejecuta en 127.0.0.1 : 5000 / (Presione CTRL + C para salir)
* Reiniciar con stat
* El depurador está activo!
* PIN del depurador: XXXXXXX

API de prueba

Después de crear la API, debe probarse.

Esto puede hacerse utilizando la utilidad curl console o el cliente Insomnia REST o publicando la API en la API rápida.



Publica nuestra API

RapidAPI es el mercado más grande del mundo con más de 10,000 API (y aproximadamente 1 millón de desarrolladores).

RapidAPI no solo proporciona una interfaz única para trabajar con API de terceros, sino que también le brinda la posibilidad de publicar su propia API de manera rápida y fácil.

Para hacer esto , primero debe publicarlo en algún servidor de la red. En nuestro caso, usaremos Heroku . Trabajar con él no debería causar ninguna dificultad ( puede obtener más información sobre él aquí ).

Cómo publicar tu API en Heroku

1. Instalar Heroku.

El primer paso es registrar e instalar la interfaz de línea de comandos (CLI) de Heroku. Esto funciona en Ubuntu 16+.

sudo snap install heroku --classic

Luego inicie sesión:

inicio de sesión de heroku

2. Agregue los archivos necesarios.

Ahora necesitamos agregar los archivos para publicación a la carpeta en nuestra aplicación:

  • requerimientos.txt con una lista de módulos Python requeridos;
  • Procfile, que indica qué comandos deben ejecutarse para iniciar la aplicación;
  • .gitignore: para excluir archivos que no son necesarios en el servidor.

El archivo require.txt contendrá las siguientes líneas:

  • matraz
  • frasco tranquilo
  • gunicorn

Tenga en cuenta: agregamos gunicorn (Python WSGI HTTP Server) a la lista, ya que necesitamos ejecutar nuestra aplicación en el servidor.

Procfile contendrá:

web: aplicación gunicorn: aplicación

El contenido de .gitignore:

 *.pyc __pycache__/ 

Ahora que se crean los archivos, inicialicemos el repositorio de git y confirmemos:

 git init git add git commit -m "First API commit" 

3. Cree una nueva aplicación Heroku.

 heroku create 

Enviamos la rama maestra al repositorio remoto de Heroku:

 git push heroku master 

Ahora puede comenzar abriendo el Servicio API utilizando los comandos:

 heroku ps:scale web=1 heroku open 

La API estará disponible en your-random-heroku-name.herokuapp.com/ai-quotes .

Cómo agregar su API de Python al mercado RapidAPI

Después de que el servicio API se publique en Heroku, puede agregarlo a Rapid API. Aquí está la documentación detallada sobre este tema.

1. Cree una cuenta RapidAPI.



Registre una cuenta gratuita: esto se puede hacer usando Facebook, Google, GitHub.



2. Agregue la API al panel de control.



3. Luego, ingrese información general sobre su API.



4. Después de hacer clic en "Agregar API", aparece una nueva página donde puede ingresar información sobre nuestra API.



5. Ahora puede ingresar manualmente los puntos finales de la API o descargar el archivo swagger usando OpenAPI.



Bueno, ahora necesitamos establecer los puntos finales de nuestra API en la página Puntos finales. En nuestro caso, los puntos finales corresponden al concepto CRUD (get, post, put, delete).



A continuación, debe crear la cotización GET AI de punto final, que muestra una cotización aleatoria (en caso de que la ID sea la predeterminada) o una cotización para la ID especificada.

Para crear un punto final, haga clic en el botón "Crear punto final".



Repita este proceso para todos los demás puntos finales API. Eso es todo! ¡Felicitaciones, has publicado tu API!

Si todo está bien, la página API se verá así:



Conclusión


En este artículo, exploramos el proceso de crear su propio Servicio API RESTful en Python, junto con el proceso de publicar una API en la nube de Heroku y agregarla al directorio RapidAPI.

Pero en la versión de prueba, solo se mostraron los principios básicos del desarrollo de la API; no se consideraron matices como la seguridad, la tolerancia a fallas y la escalabilidad.

Al desarrollar una API real, todo esto debe tenerse en cuenta.

Source: https://habr.com/ru/post/464705/


All Articles