Escrevendo uma API em Python (com Flask e RapidAPI)



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

Ao adicionar uma das muitas 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 um recurso exclusivo que deseja compartilhar com a comunidade?

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

Apesar de, a princípio, parecer uma tarefa assustadora, de fato, tudo é simples. Mostraremos como fazer isso com o Python.

O que você precisa para começar


Para desenvolver a API, você precisa:

  • Python 3
  • Flask - uma estrutura simples e fácil de usar para criar aplicativos da Web;
  • O Flask-RESTful é uma extensão do Flask que permite desenvolver uma API REST rapidamente e com configuração mínima.

A instalação é realizada pelo comando:

pip install flask-restful 

Programação intensiva gratuita recomendada para iniciantes:
Desenvolvimento de bot de telegrama em C # - 26 a 28 de agosto. Intensivo gratuito que permite entender como os bots assistentes funcionam, nos recursos do trabalho com a API do Telegram e outras nuances. Os três melhores participantes receberão 30.000 rublos do Skillbox .
Antes de começar

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

Para entender completamente o problema, vejamos os dois termos mencionados acima.

O que é REST?

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

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 data warehouse. O cliente e o servidor são independentes, qualquer um deles pode ser substituído separadamente do outro.
  • Sem estado - nenhum dado do cliente é armazenado no servidor. O estado da sessão é armazenado no lado do cliente.
  • Armazenamento em cache - os clientes podem armazenar em cache as respostas do servidor para melhorar o desempenho geral.

O que é um CRUD?

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

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

Agora que descobrimos os termos básicos, você pode 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 a IA.

Com essa API, um desenvolvedor Python pode obter rapidamente informações sobre IA e se inspirar em novos desenvolvimentos. Se o desenvolvedor tiver idéias valiosas sobre esse tópico, ele poderá adicioná-las 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) 

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

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

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

Cada entrada de repo conterá:

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

Como este é apenas um exemplo de treinamento, salvaremos todas as entradas em uma lista 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 determinará as operações dos terminais de nossa API. Quatro métodos devem ser declarados dentro da classe: get, post, put, delete.

Vamos começar com o método GET.

Permite obter uma cotação específica especificando seu ID ou uma cotação aleatória se o ID não 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 cotação aleatória se o ID contiver um valor padrão, ou seja, Ao chamar o método, nenhum ID foi definido.

Se for especificado, o método pesquisará entre aspas e encontrará uma que contenha o ID especificado. Se nada for encontrado, a mensagem “Quote not found, 404” será exibida.

Lembre-se: o método retorna um status HTTP 200 se a solicitação for bem-sucedida e 404 se o registro não for encontrado.

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

Ele receberá o identificador de cada nova cotação enquanto você digita. Além disso, o POST usará reqparse para analisar os parâmetros que serão inseridos no corpo da solicitação (autor e texto de 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 o ID da cotação. Em seguida, usando reqparse, ele obteve o autor e uma citação da consulta, armazenando-os no dicionário de parâmetros.

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

Se uma cotação com o ID especificado ainda não tiver sido criada, o método criará um novo registro com o ID e autor especificados, além de outros parâmetros. Ele então adiciona uma entrada à lista ai_quotes e retorna uma entrada com uma nova cotação junto com o código 201.

Agora crie um método PUT para modificar uma cotaçã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, pega ID e entrada e analisa parâmetros de cotação usando reqparse.

Se existir uma cotação com o ID especificado, o método o atualizará com novos parâmetros e exibirá uma cotação atualizada com o código 200. Se não houver cotação com o ID especificado, um novo registro será criado com o código 201.

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 obtém o ID da cotação enquanto você digita e atualiza a lista ai_quotes usando uma lista comum.

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/", "/ai-quotes/<int:id>") if __name__ == '__main__': app.run(debug=True) 

Nosso serviço de API REST está pronto!

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

 python3 app.py 

Se tudo estiver bem, obteremos algo assim:

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

API de teste

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

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



Publique nossa API

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

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

Para fazer isso , primeiro você precisa publicá-lo em algum servidor da rede. No nosso caso, usaremos o Heroku . Trabalhar com ele não deve causar dificuldades ( você pode aprender mais sobre ele aqui ).

Como publicar sua API no Heroku

1. Instale o Heroku.

O primeiro passo é registrar e instalar a interface de linha de comando (CLI) da Heroku. Isso funciona no Ubuntu 16+.

sudo snap instalar heroku --classic

Então faça o login:

heroku login

2. Adicione os arquivos necessários.

Agora precisamos adicionar os arquivos para publicação à pasta em nosso aplicativo:

  • requirements.txt com uma 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:

  • balão
  • tranqüilo
  • gunicorn

Observe: adicionamos o gunicorn (Python WSGI HTTP Server) à lista, pois precisamos executar nosso aplicativo no servidor.

O processo conterá:

web: gunicorn app: app

O conteúdo de .gitignore:

 *.pyc __pycache__/ 

Agora que os arquivos foram criados, vamos inicializar o git repo e confirmar:

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

3. Crie um novo aplicativo Heroku.

 heroku create 

Enviamos a ramificação principal para o repositório remoto Heroku:

 git push heroku master 

Agora você pode começar abrindo o Serviço de API usando os comandos:

 heroku ps:scale web=1 heroku open 

A API estará disponível em your-random-heroku-name.herokuapp.com/ai-quotes .

Como adicionar sua API Python ao mercado RapidAPI

Após a publicação do serviço da API no Heroku, você pode adicioná-lo à API do Rapid. Aqui está a documentação detalhada sobre este tópico.

1. Crie uma conta RapidAPI.



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



2. Adicione a API ao painel de controle.



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



4. Após clicar em "Adicionar API", uma nova página é exibida, onde você pode inserir informações sobre a nossa API.



5. Agora você pode inserir manualmente os pontos de extremidade da API ou fazer o download do arquivo swagger usando o OpenAPI.



Bem, agora precisamos definir os pontos finais da nossa API na página Pontos finais. No nosso caso, os pontos finais correspondem ao conceito CRUD (obter, postar, colocar, excluir).



Em seguida, você precisa criar a cotação GET AI do terminal, que exibe uma cotação aleatória (caso o ID seja o padrão) ou uma cotação para o ID especificado.

Para criar um ponto final, clique no botão "Criar ponto final".



Repita esse processo para todos os outros pontos de extremidade da API. Isso é tudo! Parabéns, você publicou sua API!

Se tudo estiver bem, a página da API será mais ou menos assim:



Conclusão


Neste artigo, exploramos o processo de criação de seu próprio serviço de API RESTful em Python, juntamente com o processo de publicação de uma API na nuvem Heroku e de adição 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.

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


All Articles