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á está familiarizado com as possibilidades que se abrem ao usar APIs (Interface de Programação de Aplicações).

Ao adicionar um dos muitos APIs abertas ao seu aplicativo, você pode expandir a funcionalidade desse aplicativo ou complementá-lo com os dados necessários. Mas e se você desenvolveu uma funcionalidade única que deseja compartilhar com a comunidade?

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

Embora isso possa parecer uma tarefa difícil no início, na verdade é bastante simples. Vamos explicar como fazer isso usando Python.

O que é necessário para começar?

Para desenvolver uma API, você precisa de:

  • Python 3;
  • Flask — um framework simples e fácil de usar para criar aplicativos web;
  • Flask-RESTful — uma extensão para Flask que permite desenvolver REST APIs rapidamente e com a mínima configuração.

A instalação é feita com o comando:

pip install flask-restful

Recomendamos um intensivo gratuito de programação para iniciantes:
Desenvolvimento de um bot do Telegram em C# — 26 a 28 de agosto. Um intensivo gratuito que permite entender como funcionam bots assistentes, as particularidades do uso da API do Telegram e outras nuances. Os três melhores participantes receberão 30.000 rublos da Skillbox..

Antes de começar

Vamos desenvolver uma RESTful API com funcionalidade básica de CRUD..

Para compreender totalmente a tarefa, vamos esclarecer dois termos mencionados acima.

O que é REST?

REST API (Transferência Representacional de Estado) é uma API que utiliza requisições HTTP para troca de dados.

As REST APIs devem atender a certos critérios:

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

O que é CRUD?

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

Em uma REST API, os tipos e métodos de requisições são responsáveis por ações como post, get, put e delete.

Agora que entendemos 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 cresce hoje, e Python é uma ferramenta popular para trabalhar com IA.

Com esta API, um desenvolvedor Python poderá rapidamente obter informações sobre IA e se inspirar com novas conquistas. Se o desenvolvedor tiver pensamentos valiosos sobre o tema, 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 do Flask, Api e Resource são as classes de que precisamos.

Reqparse é uma interface para análise de solicitações do Flask-RESTful... Também precisaremos do módulo random para exibir uma citação aleatória.

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

Cada registro do repositório conterá:

  • um ID digital;
  • o nome do autor da citação;
  • a citação.

Como este é apenas um exemplo para aprendizado, manteremos todos os registros em uma lista do Python. Em uma aplicação real, provavelmente usaríamos um banco de dados em vez disso.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "Os planos de negócios das próximas 10.000 startups são fáceis de prever: " +
                 "Pegue X e adicione IA."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "O desenvolvimento da inteligência artificial plena pode " +
                 "significar o fim da raça humana… " +
                 "Ela decolaria sozinha e redesenharia " +
                 "a si mesma a uma taxa cada vez maior. " +
                 "Os humanos, que estão limitados pela lenta evolução biológica, " +
                 "não poderiam competir e seriam superados."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "Eu visualizo um tempo em que nós seremos para os robôs o que " +
                 "os cães são para os humanos, " +
                 "e eu estou torcendo pelas máquinas."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "O ritmo do progresso na inteligência artificial " +
                 "(não me refiro à IA restrita) " +
                 "é incrivelmente rápido. A menos que você tenha exposição direta " +
                 "a grupos como o Deepmind, " +
                 "você não tem ideia de quão rápido — está crescendo " +
                 "em um ritmo próximo ao exponencial. " +
                 "O risco de algo seriamente perigoso " +
                 "acontecer está na faixa de cinco anos." +
                 "10 anos no máximo."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "Eu sempre estive convencido de que a única maneira " +
                 "de fazer a inteligência artificial funcionar " +
                 "é fazer o cálculo de uma maneira semelhante ao cérebro humano. " +
                 "Esse é o objetivo que venho perseguindo. Estamos avançando, " +
                 "embora ainda tenhamos muito a aprender sobre " +
                 "como o cérebro realmente funciona."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "As pessoas se preocupam que os computadores vão " +
                 "ficar muito inteligentes e dominar o mundo, " +
                 "mas o verdadeiro problema é que eles são muito estúpidos " +
                 "e já dominaram o mundo."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "Parece provável que uma vez que o método de pensamento da máquina " +
                 "tenha começado, não levaria muito tempo " +
                 "para superar nossos frágeis poderes… " +
                 "Elas seriam capazes de conversar " +
                 "entre si para aguçar suas habilidades. " +
                 "Em algum momento, portanto, devemos " +
                 "esperar que as máquinas assumam o controle."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "A inteligência artificial atingirá " +
                 "níveis humanos por volta de 2029. " +
                 "Levando isso adiante para, digamos, 2045, " +
                 "teremos multiplicado a inteligência, " +
                 "a inteligência da máquina biológica humana " +
                 "de nossa civilização em um bilhão de vezes."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Ninguém coloca dessa forma, mas eu acho " +
                 "que a inteligência artificial " +
                 "é quase uma disciplina das ciências humanas. É realmente uma tentativa " +
                 "de entender a inteligência humana e a cognição humana."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "Estamos fazendo essa analogia de que IA é a nova eletricidade." +
                 "A eletricidade transformou indústrias: agricultura, " +
                 "transporte, comunicação, manufatura."
    }
]

Agora precisamos criar uma classe de recurso Quote, que definirá as operações dos endpoints da nossa API. Dentro da classe, devemos declarar quatro métodos: get, post, put, delete.

Vamos começar pelo método GET

Ele permite obter uma citação específica informando seu ID ou uma citação aleatória, caso o ID não seja 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 tiver o valor padrão, ou seja, quando o método é chamado sem um ID especificado.

Se um ID for especificado, o método busca entre as citações e encontra aquela que contém o ID informado. Se nada for encontrado, uma mensagem "Quote not found, 404" é exibida.

Lembre-se: o método retorna o status HTTP 200 em caso de sucesso e 404 se o registro não for encontrado.

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

Ele receberá o ID de cada nova citação ao ser inserido. Além disso, o POST usará reqparse para analisar os parâmetros que chegarão no corpo da requisiçã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 recebeu o ID da citação. Em seguida, usando reqparse, ele obteve o autor e a citação da requisição, armazenando-os no dicionário params.

Se uma citação com o ID informado já existir, o método retorna uma mensagem correspondente e o código 400.

Se a citação com o ID informado ainda não tiver sido criada, o método cria um novo registro com o ID e autor especificados, e outros parâmetros. Em seguida, ele adiciona o registro à lista ai_quotes e retorna o registro da nova citação junto com o código 201.

Agora vamos criar o método PUT para modificar 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, recebe o ID e a entrada e analisa os parâmetros da citação, usando reqparse.

Se a citação com o ID especificado existir, o método a atualizará com os novos parâmetros e, em seguida, exibirá a citação atualizada com o código 200. Se a citação com o ID especificado ainda não existir, uma nova entrada será criada com o código 201.

Finalmente, vamos criar o método DELETE para remover a citação que já não nos inspira.

def delete(self, id):
      global ai_quotes
      ai_quotes = [quote for quote in ai_quotes if quote["id"] != id]
      return f"Citação com id {id} foi deletada.", 200

Esse método recebe o ID da citação como entrada e atualiza a lista ai_quotes usando a lista global.

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

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

Nosso serviço de API REST está pronto!

Em seguida, podemos salvar o código em um arquivo app.py e executá-lo no console usando o comando:

python3 app.py

Se tudo estiver certo, teremos algo como isto:

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

Testando a API

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

Isso pode ser feito usando a ferramenta de console curl ou o cliente Insomnia REST, ou publicando a API no Rapid API.

Escrevendo uma API em Python (com Flask e RapidAPI)

Publicando nossa API

RapidAPI é o maior marketplace do mundo com mais de 10.000 APIs (e cerca de 1 milhão de desenvolvedores).

RapidAPI não apenas fornece uma interface única para trabalhar com APIs de terceiros, mas também permite publicar sua própria API de forma rápida e simples.

Para para fazer isso, primeiro precisamos publicá-la em algum servidor na rede. Neste caso, usaremos Heroku. Trabalhar com ele não deve trazer complicações, (você pode saber mais sobre ele aqui).

Como publicar sua API no Heroku

1. Instalamos o Heroku.

Primeiro, você precisa se inscrever e instalar a Interface de Linha de Comando do Heroku (CLI). Isso funciona no Ubuntu 16+.

sudo snap install heroku —classic

Em seguida, faça login:

heroku login

2. Adicionando os arquivos necessários.

Agora precisamos adicionar os arquivos para publicação na pasta do nosso aplicativo:

  • requirements.txt com a lista dos módulos Python necessários;
  • Procfile, que indica quais comandos devem ser executados para iniciar o aplicativo;
  • .gitignore — para excluir arquivos que não são necessários no servidor.

O arquivo requirements.txt conterá as seguintes linhas:

  • flask
  • flask-restful
  • para processar as requisições da web. Quando uma solicitação chega ao Quay (através de nossa própria API, ou através da API do Docker), um trabalhador gevent é atribuído a ele. Normalmente, esse trabalhador deve se conectar ao banco de dados. Após a primeira falha, descobrimos que os trabalhadores gevent estavam se conectando ao banco de dados, utilizando as configurações padrão.

Por favor, note que adicionamos o gunicorn (Servidor HTTP WSGI Python) à lista, pois precisamos executar nosso aplicativo no servidor.

O Procfile conterá:

web: gunicorn app:app

Conteúdo do .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 "Primeiro commit da API"

3. Criamos um novo aplicativo Heroku.

heroku create

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

git push heroku master

Agora podemos começar, abrindo o Serviço API com os comandos:

heroku ps:scale web=1
heroku open
 

A API estará disponível no endereço your-random-heroku-name.herokuapp.com/ai-quotes.

Como adicionar sua API Python ao marketplace RapidAPI

Depois que o serviço API estiver publicado no Heroku, você pode adicioná-lo ao Rapid API. Aqui está a documentação detalhada sobre este tópico.

1. Criamos uma conta RapidAPI.

Escrevendo uma API em Python (com Flask e RapidAPI)

Registre-se para uma conta gratuita — isso pode ser feito através do Facebook, Google, GitHub.

Escrevendo uma API em Python (com Flask e RapidAPI)

2. Adicione a API ao painel de controle.

Escrevendo uma API em Python (com Flask e RapidAPI)

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

Escrevendo uma API em Python (com Flask e RapidAPI)

4. Após clicar em 'Adicionar API', aparece uma nova página 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 fazer o upload do swagger-file usando o OpenAPI.

Escrevendo uma API em Python (com Flask e RapidAPI)

Agora é necessário definir os endpoints da nossa API na página Endpoints. No nosso caso, os endpoints correspondem ao conceito CRUD (get, post, put, delete).

Escrevendo uma API em Python (com Flask e RapidAPI)

Em seguida, precisamos criar o endpoint GET AI Quote, que retorna uma citação aleatória (caso o ID seja o padrão) ou uma citação para o ID especificado.

Para criar o endpoint, clique no botão 'Criar Endpoint'.

Escrevendo uma API em Python (com Flask e RapidAPI)

Repita esse processo para todos os outros endpoints da API. E é isso! Parabéns, você publicou sua API!

Se tudo estiver bom, a página da API deve se parecer com isso:

Escrevendo uma API em Python (com Flask e RapidAPI)

Conclusão

Neste artigo, exploramos o processo de criação do nosso próprio Serviço API RESTful em Python, juntamente com o processo de publicação da API na nuvem Heroku e sua adição ao catálogo RapidAPI.

Mas na versão de teste, foram mostrados apenas os princípios básicos do desenvolvimento de API — considerações como segurança, tolerância a falhas e escalabilidade não foram abordadas.

Ao desenvolver uma API real, tudo isso deve ser considerado.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster