Escrevendo uma API em Python (com Flask e RapidAPI)

Escrevendo uma API em Python (com Flask e RapidAPI)

Se você está lendo este artigo, provavelmente já conhece as possibilidades que se abrem ao utilizar a API (Application Programming Interface).

Ao adicionar uma das muitas APIs públicas ao seu aplicativo, você pode estender a funcionalidade desse aplicativo ou complementá-lo com os dados necessários. Mas e se você desenvolveu um recurso exclusivo que deseja compartilhar com a comunidade?

A resposta é simples: você precisa crie sua própria API.

Embora isso possa parecer uma tarefa assustadora no começo, na verdade é bem simples. Mostraremos como fazer isso com Python.

O que você precisa para começar

O desenvolvimento de API requer:

  • Python3;
  • Frasco — um framework simples e fácil de usar para criar aplicações web;
  • Frasco-RESTful é uma extensão para Flask que permite desenvolver uma API REST rapidamente e com configuração mínima.

A instalação é realizada pelo comando:

pip install flask-restful

Recomendamos uma programação intensiva gratuita para iniciantes:
Desenvolvimento de bot do Telegram em C# — 26 a 28 de agosto. Um intensivo gratuito que permite entender como funcionam os bots auxiliares, os recursos de trabalhar com a API do Telegram e outras nuances. Os três primeiros participantes receberão 30 rublos da Skillbox.

Antes que você comece

Vamos desenvolver uma API RESTful com um básico funcionalidade CRUID.

Para entender completamente a tarefa, vamos entender os dois termos mencionados acima.

O que é REST?

REST API (Representational State Transfer) é uma API que usa solicitações HTTP para trocar dados.

As APIs REST devem atender a certos critérios:

  • Arquitetura cliente-servidor: o cliente interage com a interface do usuário e o servidor interage com o back-end e o armazenamento de dados. O cliente e o servidor são independentes, qualquer um deles pode ser substituído separadamente do outro.
  • Stateless - Nenhum dado do cliente é armazenado no servidor. O estado da sessão é armazenado no lado do cliente.
  • Capacidade de cache - os clientes podem armazenar em cache as respostas do servidor para melhorar o desempenho geral.

O que é CRUD?

CRU é um conceito de programação que descreve quatro ações básicas (criar, ler, atualizar e excluir).

Na API REST, os tipos de solicitação e os métodos de solicitação são responsáveis ​​por ações como postar, obter, colocar, excluir.

Agora que lidamos com os termos básicos, podemos começar a criar a API.

Desenvolvimento

Vamos criar um repositório de citações sobre inteligência artificial. A IA é uma das tecnologias que mais crescem atualmente, e o Python é uma ferramenta popular para trabalhar com IA.

Com essa API, um desenvolvedor Python pode aprender rapidamente sobre IA e se inspirar em novas conquistas. Se o desenvolvedor tiver pensamentos valiosos sobre esse tópico, ele poderá adicioná-los ao repositório.

Vamos começar importando os módulos necessários e configurando o Flask:

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

Neste snippet, Flask, Api e Resource são as classes de que precisamos.

Reqparse é uma interface de análise de solicitação Flask-RESTful... Você também precisará do módulo random para exibir uma citação aleatória.

Agora vamos criar um repositório de citações sobre IA.

Cada entrada de repositório conterá:

  • identificação digital;
  • o nome do autor da citação;
  • citar.

Como este é apenas um exemplo de aprendizado, armazenaremos todas as entradas em uma lista do Python. Em um aplicativo real, provavelmente usaríamos um banco de dados.

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 precisamos criar uma classe de recurso Quote que definirá as operações de nossos endpoints de API. Quatro métodos devem ser declarados dentro da classe: get, post, put, delete.

Vamos começar com o método GET

Ele permite que você obtenha uma cotação específica especificando seu ID ou uma cotação aleatória se nenhum ID for especificado.

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 retorna uma citação aleatória se o ID contiver o valor padrão, ou seja, ao chamar o ID do método não foi definido.

Se estiver definido, o método pesquisa entre aspas e encontra aquela que contém o ID fornecido. Se nada for encontrado, a mensagem “Citação não encontrada, 404” é exibida.

Lembre-se, o método retorna um status HTTP de 200 se a solicitação for bem-sucedida e 404 se a entrada não for encontrada.

Agora vamos criar um método POST para adicionar uma nova citação ao repositório

Ele obterá o id de cada nova citação enquanto você digita. Além disso, o POST usará o reqparse para analisar os parâmetros que irão no corpo da solicitação (autor e texto da citação).

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 acima, o método POST aceitou um ID de cotação. Em seguida, usando reqparse, recuperou o autor e a citação da solicitação, armazenando-os no dicionário de parâmetros.

Se já existir uma cotação com o ID especificado, o método exibirá a mensagem apropriada e o código 400.

Se ainda não foi criada uma citação com o ID especificado, o método cria uma nova entrada com o ID e o autor especificados, além de outros parâmetros. Em seguida, adiciona uma entrada à lista ai_quotes e retorna uma entrada com uma nova cotação junto com um código 201.

Agora criamos um método PUT para alterar uma citação existente no repositório

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, semelhante ao exemplo anterior, usa um ID e uma entrada e analisa os parâmetros de cotação usando reqparse.

Se existir uma cotação com o ID especificado, o método irá atualizá-la com os novos parâmetros e então gerará a cotação atualizada com o código 200. Se ainda não houver cotação com o ID especificado, um novo registro com o código 201 será criado.

Por fim, vamos criar um método DELETE para remover uma citação que não é mais 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 usa o ID da cotação como entrada e atualiza a lista de ai_quotes usando a lista compartilhada.

Agora que criamos todos os métodos, tudo o que precisamos fazer é simplesmente adicionar o recurso à API, definir o caminho e executar o Flask.

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

Nosso serviço REST API está pronto!

Em seguida, podemos salvar o código no arquivo app.py executando-o no console com o comando:

python3 app.py

Se tudo estiver bem, teremos algo assim:

* Modo de depuração: ativado
* Correndo em 127.0.0.1:5000/ (Pressione CTRL+C para sair)
* Reiniciando com stat
* O depurador está ativo!
* PIN do depurador: XXXXXXX

Testando a API

Depois que a API é criada, ela precisa ser testada.

Isso pode ser feito usando o utilitário de console curl ou o cliente Insomnia REST, ou publicando a API na API Rapid.

Escrevendo uma API em Python (com Flask e RapidAPI)

Publicando nossa API

RapidAPI é o maior mercado do mundo com mais de 10 APIs (e cerca de 000 milhão de desenvolvedores).

O RapidAPI não apenas fornece uma interface única para trabalhar com APIs de terceiros, mas também permite que você publique sua própria API de maneira rápida e fácil.

Para faça, primeiro você precisa publicá-lo em algum servidor da rede. No nosso caso, usaremos Heroku. Trabalhar com ele não deve causar nenhuma dificuldade, (Você pode descobrir mais sobre isso aqui).

Como publicar sua API no Heroku

1. Instale o Heroku.

A primeira etapa é registrar e instalar a interface de linha de comando (CLI) do Heroku. Isso funciona no Ubuntu 16+.

sudo snap install heroku --classic

Então nós logamos:

login do heroku

2. Adicione os arquivos necessários.

Agora precisamos adicionar os arquivos a serem publicados em uma pasta em nosso aplicativo:

  • requirements.txt com uma lista de módulos Python necessários;
  • Procfile, que especifica quais comandos devem ser executados para rodar a aplicação;
  • .gitignore - para excluir arquivos que não são necessários no servidor.

O arquivo requirements.txt conterá as seguintes linhas:

  • frasco
  • repousante
  • gunicórnio

Observe que adicionamos gunicorn (Python WSGI HTTP Server) à lista porque precisamos executar nosso aplicativo no servidor.

Procfile conterá:

web: gunicorn app: app

Conteúdo de .gitignore:

*.pyc
__pycache__/

Agora que os arquivos foram criados, vamos inicializar o repositório git e fazer o commit:

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

3. Crie um novo aplicativo Heroku.

heroku create

Enviando o branch master para o repositório Heroku remoto:

git push heroku master

Agora você pode começar abrindo o API Service com os comandos:

heroku ps:scale web=1
heroku open
 

A API estará disponível em seu-aleatório-heroku-name.herokuapp.com/ai-quotes.

Como adicionar sua API Python ao mercado RapidAPI

Depois que o serviço API for publicado no Heroku, você poderá adicioná-lo à API Rapid. Aqui documentação detalhada neste tópico.

1. Crie uma conta RapidAPI.

Escrevendo uma API em Python (com Flask e RapidAPI)

Registramos uma conta gratuita - isso pode ser feito usando Facebook, Google, GitHub.

Escrevendo uma API em Python (com Flask e RapidAPI)

2. Adicione API ao painel de controle.

Escrevendo uma API em Python (com Flask e RapidAPI)

3. Em seguida, insira informações gerais sobre sua API.

Escrevendo uma API em Python (com Flask e RapidAPI)

4. Depois de clicar em "Adicionar API", uma nova página aparece onde você pode inserir informações sobre nossa API.

Escrevendo uma API em Python (com Flask e RapidAPI)

5. Agora você pode inserir manualmente os endpoints da API ou baixar arquivo de arrogância usando OpenAPI.

Escrevendo uma API em Python (com Flask e RapidAPI)

Bem, agora você precisa definir os endpoints de nossa API na página Endpoints. No nosso caso, os endpoints correspondem ao conceito de CRUD (get, post, put, delete).

Escrevendo uma API em Python (com Flask e RapidAPI)

Em seguida, você precisa criar um endpoint GET AI Quote que exiba uma cotação aleatória (se o ID for padrão) ou uma cotação para o ID especificado.

Para criar um endpoint, você precisa clicar no botão “Create Endpoint”.

Escrevendo uma API em Python (com Flask e RapidAPI)

Repetimos esse processo para todos os outros endpoints da API. Isso é tudo! Parabéns, você publicou sua API!

Se tudo correr bem, a página da API ficará mais ou menos assim:

Escrevendo uma API em Python (com Flask e RapidAPI)

Conclusão

Neste artigo, percorremos o processo de criação de nosso próprio serviço de API RESTful em Python, juntamente com o processo de publicação da API na nuvem Heroku e adicioná-la ao diretório RapidAPI.

Mas na versão de teste, apenas os princípios básicos do desenvolvimento da API foram mostrados - nuances como segurança, tolerância a falhas e escalabilidade não foram consideradas.

Ao desenvolver uma API real, tudo isso deve ser levado em consideração.

Fonte: habr.com

Adicionar um comentário