Tutorial: Escrevendo uma API REST com o Tornado & Motor

Aprenda a construir sua própria API REST de fala JSON usando a biblioteca de rede Tornado assíncrona.

Ramit Mittal Blocked Unblock Seguir Seguindo 29 de junho

Não seria exagero dizer que as APIs REST alimentam a web. Tudo, desde as redes sociais até os aplicativos que ajudam você a comprar pizzas, é alimentado por APIs REST. Na verdade, aplicativos móveis, aplicativos corporativos e até jogos precisam conversar com os servidores de vez em quando (muito curto). Não faz sentido limitar os tutoriais da API REST apenas aos desenvolvedores da web.

Fotografia de Sam Loyd

Tornado e Motor

O Tornado é um framework da Web maduro e testado em batalha, escrito em Python. Motor é um driver assíncrono para o MongoDB que se integra muito bem com o Tornado. Estas serão as duas principais ferramentas em que trabalharemos à medida que criarmos nossa API de super-heróis.

Pré-requisitos e configuração inicial

Antes de começarmos, por favor, verifique se você tem:

  • python>=3.6 instalado em sua máquina.
  • O módulo venv junto com pip instalado.
  • mongodb instalado e funcionando em localhost:27017 .
  • Um editor de texto decente ou IDE.

No Ubuntu e em sistemas semelhantes, o venv e o pip podem ser facilmente instalados usando:

 $ sudo apt instalar python3-pip python3-venv 

Crie um ambiente virtual para o nosso novo projeto.

 heróis $ mkdir 
$ cd heros
$ python3 -m venv env

Instale as dependências do projeto.

 $ source env / bin / activate 
$ pip instalar motor de tornado

Configuração Inicial do Aplicativo

Crie uma pasta chamada heroes dentro da pasta do projeto (que é confusamente também chamada de heroes mas é assim que as coisas são!). Esta pasta irá conter nossos arquivos .py .

  • No arquivo app.py , criamos uma instância de tornado.web.Application e fazemos com que o tornado.httpserver.HTTPServer sirva.
  • O arquivo handlers.py contém os manipuladores de solicitação que herdam de tornado.web.RequestHandler .
  • O HomeHandler implementa o método get para que ele possa manipular solicitações GET . Tornado envia automaticamente a resposta como JSON quando um dicionário é passado como um parâmetro para o método de write .
  • O ErrorHandler implementa o método prepare que é chamado antes do método get ou qualquer outro método. Neste caso, enviamos uma mensagem de erro e terminamos a resposta.

Acionando o Motor

Conectar o driver do MongoDB ao Tornado é mais simples que a maioria dos frameworks da web.

  • Anexe uma instância do MotorClient ao objeto Application .
  • Use o banco de dados de heroes .
  • Refatore os manipuladores para herdar de um BaseHandler . Esta etapa não é necessária, mas nos salvará de muitos códigos duplicados no futuro.

Obrigado Pycharm por esses incríveis Git Diffs ! Se você preferir copiar, você pode encontrar os arquivos atualizados aqui .

Uma API para super-heróis

Adicione um endpoint /heroes que permita operações CRUD para o recurso hero .

  • Adicione as rotas /heroes à instância do Application em app.py
  • Adicione o método prepare no BaseHandler que analisa automaticamente o corpo da solicitação como JSON para solicitações POST e PUT .
  • Adicione a classe HeroesHandler com os HeroesHandler get , put , delete e post .

Git Diff para arquivo app.py

Duas rotas são adicionadas ao aplicativo. Um para o endpoint /heroes e outro para o endpoint /heroes/<hero_id> . Enquanto o primeiro é o terminal geral do recurso, o último é usado para operações em um único item.

As mudanças no handlers.py são muitas para mostrar em um diff . Por favor, verifique a lista completa do código fonte abaixo.

Listagem do código final

  • O método get retorna todos os heroes para a rota /heroes . Para a rota /heroes/<hero_id> , os detalhes de um único herói são retornados.
  • O método get também implementa uma forma básica de paginação.
  • O método post cria um novo herói no banco de dados. O name é obrigatório enquanto os outros campos são opcionais.
  • O método put é usado para substituir um herói existente por outro diferente.
  • Além disso, observe o uso da sintaxe async/await para operações de banco de dados assíncrono.

Estrutura Final do Projeto

Uma visão em tree da pasta do projeto heroes .

 Heróis 
Her?? heróis
App ??? app.py
Hand ??? handlers.py
Py ??? __pycache__
Env?? env
Bin?? bin
??? incluem
Lib?? lib
Lib?? lib64 -> lib
Py?? pyvenv.cfg
 7 diretórios, 3 arquivos 

Executando o aplicativo

  • Assegure-se de que o processo do mongod esteja executando em localhost:27017 .
  • Abra um terminal na pasta raiz do projeto e execute:
 $ source env / bin / activate 
$ export PORT = 8080
$ export MONGO_CONNECT_URI = mongodb: // localhost: 27017
$ python3 -m heroes.app

O servidor de API agora deve estar ativo e em execução. Vamos acertar os endpoints e verificar os resultados.

Consumindo a API REST

httpie é uma ótima biblioteca para consumir APIs a partir da linha de comando. Você pode instalá-lo usando:

 $ pip install httpie 

Qual o proximo?

Nós construímos uma API REST muito legal, mas está longe de estar pronta para produção. Nossa API pode ser muito mais robusta e fácil de usar. Se você quiser aprender mais,

Texto original em inglês.