Escribir unha API en Python (con Flask e RapidAPI)

Escribir unha API en Python (con Flask e RapidAPI)

Se estás a ler este artigo, probablemente xa esteas familiarizado coas posibilidades que se abren ao utilizar a API (Interface de programación de aplicacións).

Ao engadir unha das moitas API públicas á túa aplicación, podes ampliar a funcionalidade desta aplicación ou complementala cos datos necesarios. Pero e se desenvolveu unha función única que quere compartir coa comunidade?

A resposta é sinxela: necesitas crea a túa propia API.

Aínda que ao principio isto pode parecer unha tarefa desalentadora, en realidade é bastante sinxelo. Imos amosarche como facelo con Python.

O que necesitas para comezar

O desenvolvemento da API require:

  • Python 3;
  • Frasco — un marco sinxelo e fácil de usar para crear aplicacións web;
  • Frasco-RESTO é unha extensión para Flask que permite desenvolver unha API REST de forma rápida e cunha configuración mínima.

A instalación realízase mediante o comando:

pip install flask-restful

Recomendamos unha programación intensiva gratuíta para principiantes:
Desenvolvemento de bots de Telegram en C# - 26-28 de agosto. Un intensivo gratuíto que che permite comprender como funcionan os robots auxiliares, as características de traballar coa API de Telegram e outros matices. Os tres primeiros participantes recibirán 30 rublos de Skillbox.

Antes de comezar

Imos desenvolver unha API RESTful cun básico Funcionalidade CRUID.

Para comprender completamente a tarefa, entendamos os dous termos mencionados anteriormente.

Que é REST?

REST API (Representational State Transfer) é unha API que usa solicitudes HTTP para intercambiar datos.

As API REST deben cumprir certos criterios:

  • Arquitectura cliente-servidor: o cliente interactúa coa interface de usuario e o servidor interactúa co backend e o almacén de datos. O cliente e o servidor son independentes, calquera deles pódese substituír por separado do outro.
  • Sen estado: non se almacenan datos do cliente no servidor. O estado da sesión almacénase no lado do cliente.
  • Capacidade de caché: os clientes poden almacenar na caché as respostas do servidor para mellorar o rendemento xeral.

Que é CRUD?

CRUDO é un concepto de programación que describe catro accións básicas (crear, ler, actualizar e eliminar).

Na API REST, os tipos de solicitude e os métodos de solicitude son responsables de accións como publicar, obter, poñer e eliminar.

Agora que tratamos os termos básicos, podemos comezar a crear a API.

Desenvolvemento

Imos crear un repositorio de citas sobre intelixencia artificial. A IA é unha das tecnoloxías de máis rápido crecemento na actualidade e Python é unha ferramenta popular para traballar con IA.

Con esta API, un programador de Python pode aprender rapidamente sobre a IA e inspirarse nos novos logros. Se o desenvolvedor ten pensamentos valiosos sobre este tema, poderá engadilos ao repositorio.

Comecemos importando os módulos necesarios e configurando Flask:

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

Neste fragmento, Flask, Api e Resource son as clases que necesitamos.

Reqparse é unha interface de análise de solicitudes Flask-RESTful... Tamén necesitarás o módulo aleatorio para mostrar unha cita aleatoria.

Agora imos crear un repositorio de citas sobre AI.

Cada entrada de repositorio conterá:

  • DNI dixital;
  • o nome do autor da cita;
  • cita.

Xa que este é só un exemplo de aprendizaxe, almacenaremos todas as entradas nunha lista de Python. Nunha aplicación real, o máis probable é que usemos unha 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."
    }
]

Agora necesitamos crear unha clase de recurso Quote que definirá as operacións dos nosos puntos finais da API. Dentro da clase deben declararse catro métodos: get, post, put, delete.

Comecemos co método GET

Permítelle obter unha cotización específica especificando o seu ID, ou unha cotización aleatoria se non se especifica ningún 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

O método GET devolve unha cita aleatoria se o ID contén o valor predeterminado, é dicir. ao chamar non se estableceu o ID do método.

Se está definido, o método busca entre comiñas e atopa o que contén o ID indicado. Se non se atopa nada, móstrase a mensaxe "Cita non atopada, 404".

Lembra que o método devolve un estado HTTP de 200 se a solicitude foi exitosa e 404 se non se atopou a entrada.

Agora imos crear un método POST para engadir unha nova cita ao repositorio

Recibirá o ID de cada cita nova mentres escriba. Ademais, POST usará reqparse para analizar os parámetros que irán no corpo da solicitude (texto de autor e 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

No código anterior, o método POST aceptou un ID de cotización. Despois, usando reqparse, recuperou o autor e a cita da solicitude, gardándoos no dicionario de parámetros.

Se xa existe unha cotización co ID especificado, entón o método mostra a mensaxe apropiada e o código 400.

Se aínda non se creou unha cita co ID especificado, o método crea unha nova entrada co ID e o autor especificados, así como outros parámetros. Despois engade unha entrada á lista ai_quotes e devolve unha entrada cunha cita nova xunto cun código 201.

Agora creamos un método PUT para cambiar unha cita existente no 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

O método PUT, semellante ao exemplo anterior, toma un ID e unha entrada e analiza os parámetros de cita usando reqparse.

Se existe unha cotización co ID especificado, o método actualizaraa cos novos parámetros e, a continuación, sairá a cotización actualizada co código 200. Se aínda non hai unha cotización co ID especificado, crearase un novo rexistro co código 201.

Finalmente, imos crear un método DELETE para eliminar unha cita que xa non é 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 o ID da cita como entrada e actualiza a lista de ai_quotes usando a lista compartida.

Agora que creamos todos os métodos, todo o que temos que facer é engadir o recurso á API, establecer o camiño e executar Flask.

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

O noso servizo de API REST está listo!

A continuación, podemos gardar o código no ficheiro app.py executándoo na consola co comando:

python3 app.py

Se todo está ben, entón teremos algo como isto:

* Modo de depuración: activado
* Correndo 127.0.0.1:5000/ (Preme CTRL+C para saír)
* Reiniciando con stat
* O depurador está activo!
* PIN do depurador: XXXXXXX

Probando a API

Despois de crear a API, debe ser probada.

Isto pódese facer usando a utilidade curl console ou o cliente Insomnia REST, ou publicando a API na API Rapid.

Escribir unha API en Python (con Flask e RapidAPI)

Publicando a nosa API

RapidAPI é o mercado máis grande do mundo con máis de 10 API (e preto de 000 millón de desenvolvedores).

RapidAPI non só ofrece unha única interface para traballar con API de terceiros, senón que tamén che permite publicar a túa propia API de forma rápida e sinxela.

Para para facer isto, primeiro debes publicalo nalgún servidor da rede. No noso caso, utilizaremos Heroku. Traballar con el non debería causar ningunha dificultade, (podes saber máis sobre iso aquí).

Como publicar a túa API en Heroku

1. Instala Heroku.

O primeiro paso é rexistrar e instalar a interface de liña de comandos (CLI) de Heroku. Isto funciona en Ubuntu 16+.

sudo snap install heroku --classic

Despois iniciamos sesión:

inicio de sesión de heroku

2. Engade os ficheiros necesarios.

Agora necesitamos engadir os ficheiros para publicar nun cartafol da nosa aplicación:

  • requirements.txt cunha lista de módulos de Python necesarios;
  • Procfile, que especifica que comandos se deben executar para executar a aplicación;
  • .gitignore - para excluír ficheiros que non son necesarios no servidor.

O ficheiro requirements.txt conterá as seguintes liñas:

  • matraz
  • matraz repousado
  • gunicornio

Teña en conta que engadimos gunicorn (Servidor HTTP Python WSGI) á lista porque necesitamos executar a nosa aplicación no servidor.

O perfil conterá:

web: aplicación gunicorn: aplicación

Contido de .gitignore:

*.pyc
__pycache__/

Agora que se crean os ficheiros, imos inicializar o repositorio git e commit:

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

3. Crea unha nova aplicación Heroku.

heroku create

Empuxando a rama mestra ao repositorio remoto de Heroku:

git push heroku master

Agora podes comezar abrindo o servizo API cos comandos:

heroku ps:scale web=1
heroku open
 

A API estará dispoñible en your-random-heroku-name.herokuapp.com/ai-quotes.

Como engadir a túa API de Python ao mercado RapidAPI

Unha vez que se publique o servizo de API en Heroku, podes engadilo á API de Rapid. Aquí documentación detallada sobre este tema.

1. Crea unha conta de RapidAPI.

Escribir unha API en Python (con Flask e RapidAPI)

Rexistramos unha conta gratuíta - isto pódese facer usando Facebook, Google, GitHub.

Escribir unha API en Python (con Flask e RapidAPI)

2. Engade API ao panel de control.

Escribir unha API en Python (con Flask e RapidAPI)

3. A continuación, introduza información xeral sobre a súa API.

Escribir unha API en Python (con Flask e RapidAPI)

4. Despois de facer clic en "Engadir API" aparece unha nova páxina onde podes introducir información sobre a nosa API.

Escribir unha API en Python (con Flask e RapidAPI)

5. Agora podes introducir manualmente os puntos finais da API ou descargalos arquivo swagger usando OpenAPI.

Escribir unha API en Python (con Flask e RapidAPI)

Ben, agora tes que configurar os puntos finais da nosa API na páxina Puntos finais. No noso caso, os extremos corresponden ao concepto de CRUD (get, post, put, delete).

Escribir unha API en Python (con Flask e RapidAPI)

A continuación, cómpre crear un punto final GET AI Quote que mostre unha cotización aleatoria (se o ID é predeterminado) ou unha cotización para o ID especificado.

Para crear un punto final, cómpre facer clic no botón "Crear punto final".

Escribir unha API en Python (con Flask e RapidAPI)

Repetimos este proceso para todos os demais puntos finais da API. Iso é todo! Parabéns, publicaches a túa API.

Se todo vai ben, a páxina da API terá un aspecto así:

Escribir unha API en Python (con Flask e RapidAPI)

Conclusión

Neste artigo, percorremos o proceso de creación do noso propio servizo de API RESTful en Python, xunto co proceso de publicación da API na nube Heroku e engadila ao directorio RapidAPI.

Pero na versión de proba, só se mostraron os principios básicos do desenvolvemento da API: non se consideraron matices como a seguridade, a tolerancia a fallos e a escalabilidade.

Ao desenvolver unha API real, hai que ter en conta todo isto.

Fonte: www.habr.com

Engadir un comentario