Escribir una API en Python (con Flask y RapidAPI)

Escribir una API en Python (con Flask y RapidAPI)

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

Al agregar una de las muchas API públicas a su aplicación, puede ampliar la funcionalidad de esta aplicación o complementarla con los datos necesarios. Pero, ¿qué pasa si has desarrollado una característica única que quieres compartir con la comunidad?

La respuesta es simple: necesitas crea tu propia API.

Si bien esto puede parecer una tarea desalentadora al principio, en realidad es bastante simple. Le mostraremos cómo hacer esto con Python.

Lo que necesitas para empezar

El desarrollo de API requiere:

  • Pitón 3;
  • Frasco — un marco simple y fácil de usar para crear aplicaciones web;
  • Frasco-REPOSO 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

Recomendamos una programación intensiva gratuita para principiantes:
Desarrollo de bots de Telegram en C# — 26 al 28 de agosto. Un intensivo gratuito que te permitirá comprender cómo funcionan los robots auxiliares, las características de trabajar con la API de Telegram y otros matices. Los tres mejores participantes recibirán 30 rublos de Skillbox.

Antes de empezar

Vamos a desarrollar una API RESTful con un básico Funcionalidad CRUIDO.

Para comprender completamente la tarea, comprendamos los dos términos mencionados anteriormente.

¿Qué es el DESCANSO?

REST API (Representational State Transfer) 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 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 y eliminar.

Ahora que hemos abordado los términos básicos, podemos 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 aprender rápidamente sobre la IA e inspirarse con nuevos logros. 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 solicitudes Flask-RESTful... También necesitará el módulo aleatorio para mostrar una cita aleatoria.

Ahora crearemos un repositorio de citas sobre IA.

Cada entrada del repositorio contendrá:

  • identificación digital;
  • el nombre del autor de la cita;
  • cita.

Como este es solo un ejemplo de aprendizaje, almacenaremos todas las entradas en una lista de Python. En una aplicación real, lo más probable es que utilicemos 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 clase de recurso Quote que definirá las operaciones de nuestros puntos finales API. Se deben declarar cuatro métodos dentro de la clase: obtener, publicar, poner, eliminar.

Comencemos con el método GET.

Le permite obtener una cotización específica especificando su ID, o una cotización aleatoria si no se especifica ninguna 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 comilla aleatoria si el ID contiene el valor predeterminado, es decir al llamar, el ID del método no estaba configurado.

Si está configurado, entonces el método busca entre comillas y encuentra la que contiene el ID dado. Si no se encuentra nada, se muestra el mensaje "Cotización no encontrada, 404".

Recuerde, el método devuelve un estado HTTP de 200 si la solicitud fue exitosa y 404 si no se encontró la entrada.

Ahora creemos un método POST para agregar una nueva cotización al repositorio.

Obtendrá la identificación de cada nueva cotización a medida que escriba. Además, POST utilizará reqparse para analizar los parámetros que irán en el cuerpo de la solicitud (autor y texto de la 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ó un ID de cotización. Luego, usando reqparse, recuperó el autor y la cita de la solicitud, almacenándolos en el diccionario de parámetros.

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

Si aún no se ha creado una cita con el ID especificado, el método crea una nueva entrada con el 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 cotización junto con un código 201.

Ahora creamos un método PUT para cambiar 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 un ID y una entrada y analiza los parámetros de cotización usando reqparse.

Si existe una cotización con el ID especificado, el método la actualizará con los nuevos parámetros y luego generará la cotización actualizada con el código 200. Si aún no hay una cotización con el ID especificado, 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 toma el ID de la cotización como entrada y actualiza la lista de ai_quotes utilizando la lista compartida.

Ahora que hemos creado todos los métodos, todo lo que tenemos que hacer es simplemente 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 REST API está listo!

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

python3 app.py

Si todo está bien, obtendremos algo como esto:

* Modo de depuración: activado
* Que se ejecuta en 127.0.0.1:5000/ (Presione CTRL+C para salir)
* Reiniciando con estadística
* ¡El depurador está activo!
* PIN del depurador: XXXXXXX

Probando la API

Una vez creada la API, es necesario probarla.

Esto se puede hacer usando la utilidad de la consola curl o el cliente REST de Insomnia, o publicando la API en Rapid API.

Escribir una API en Python (con Flask y RapidAPI)

Publicando nuestra API

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

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

a hazlo, primero debe publicarlo en algún servidor de la red. En nuestro caso usaremos Heroku. Trabajar con él no debería causar ninguna dificultad, (puedes encontrar más información al respecto aquí).

Cómo publicar su API en Heroku

1. Instale 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 instalar heroku --classic

Luego iniciamos sesión:

inicio de sesión de heroku

2. Agregue los archivos necesarios.

Ahora necesitamos agregar los archivos a publicar en una carpeta de nuestra aplicación:

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

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

  • frasco
  • matraz de descanso
  • gunicornio

Tenga en cuenta que hemos agregado gunicorn (servidor HTTP Python WSGI) a la lista porque necesitamos ejecutar nuestra aplicación en el servidor.

El archivo de perfil contendrá:

web: aplicación gunicorn: aplicación

Contenido de .gitignore:

*.pyc
__pycache__/

Ahora que los archivos están creados, inicialicemos el repositorio de git y confirmemos:

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

3. Crea una nueva aplicación Heroku.

heroku create

Enviar la rama maestra al repositorio remoto de Heroku:

git push heroku master

Ahora puedes comenzar abriendo el Servicio API con los comandos:

heroku ps:scale web=1
heroku open
 

La API estará disponible en tu-nombre-aleatorio-de-heroku.herokuapp.com/ai-quotes.

Cómo agregar su API de Python al mercado RapidAPI

Una vez que el servicio API esté publicado en Heroku, puede agregarlo a Rapid API. Aquí documentación detallada sobre este tema.

1. Cree una cuenta RapidAPI.

Escribir una API en Python (con Flask y RapidAPI)

Registramos una cuenta gratuita; esto se puede hacer usando Facebook, Google, GitHub.

Escribir una API en Python (con Flask y RapidAPI)

2. Agregue API al panel de control.

Escribir una API en Python (con Flask y RapidAPI)

3. A continuación, ingrese información general sobre su API.

Escribir una API en Python (con Flask y RapidAPI)

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

Escribir una API en Python (con Flask y RapidAPI)

5. Ahora puede ingresar manualmente los puntos finales de la API o descargar archivo de arrogancia utilizando OpenAPI.

Escribir una API en Python (con Flask y RapidAPI)

Bueno, ahora necesitas configurar los puntos finales de nuestra API en la página Puntos finales. En nuestro caso, los puntos finales corresponden al concepto de CRUD (obtener, publicar, poner, eliminar).

Escribir una API en Python (con Flask y RapidAPI)

A continuación, debe crear un punto final GET AI Quote que muestre una cotización aleatoria (si el ID es el predeterminado) o una cotización para el ID especificado.

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

Escribir una API en Python (con Flask y RapidAPI)

Repetimos este proceso para todos los demás puntos finales de API. ¡Eso es todo! ¡Felicitaciones, ha publicado su API!

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

Escribir una API en Python (con Flask y RapidAPI)

Conclusión

En este artículo, repasamos el proceso de creación de nuestro propio servicio API RESTful en Python, junto con el proceso de publicar la 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 API; no se consideraron matices como la seguridad, la tolerancia a fallas y la escalabilidad.

A la hora de desarrollar una API real, hay que tener todo esto en cuenta.

Fuente: habr.com

Añadir un comentario