Portuguese (Português) translation by Erick Patrick (you can also view the original English article)
Na primeira parte dessa série, vimos como criar APIs RESTful por conta própria usando Flask como a framework Web. A abordagem anterior deu-nos bastante flexibilidade mas também requereu muito código, que poderia ser evitado em casos mais genéricos.
Agora, usaremos uma extensão do Flask, Flask-Restless, que gera APIs RESTful para modelos de banco de dados definidos com SQLAlchemy. Usaremos a mesma aplicação exemplo da parte anterior para manter o contexto e dar continuidade.
Instalando Dependências
Embora continuemos a aplicação do tutorial anterior, precisamos instalar uma nova dependência:
1 |
$ pip install Flask-Restless |
A Aplicação
Flask-Restless
facilita a adição APIs RESTful para modelos criados com SQLAlchemy. Primeiro, adicionemos o APIManager
da extensão flask.ext.restless
ao arquivo de configuração da aplicação.
flask_app/my_app/__init__.py
1 |
from flask.ext.restless import APIManager |
2 |
|
3 |
manager = APIManager(app, flask_sqlalchemy_db=db) |
Adicionar essas poucas linhas ao nosso código já existente deve servir.
flask_app/my_app/catalog/views.py
Esse arquivo compreende as maiores mudanças em relação artigo anterior. Abaixo, temos o arquivo completamente reescrito.
1 |
from flask import Blueprint |
2 |
from my_app import manager |
3 |
from my_app.catalog.models import Product |
4 |
|
5 |
catalog = Blueprint('catalog', __name__) |
6 |
|
7 |
@catalog.route('/') |
8 |
@catalog.route('/home') |
9 |
def home(): |
10 |
return "Welcome to the Catalog Home." |
11 |
|
12 |
manager.create_api(Product, methods=['GET', 'POST']) |
O funcionamento do código acima é autoexplicativo. Apenas importamos o manager
que criamos no arquivo anterior e usamo-no para criar uma API para o modelo Product
com os métodos (methods
) listados. Podemos adicionar mais métodos como o DELETE
, PUT
, PATCH
, etc., se precisarmos.
Aplicação em Ação
Testemos essa aplicação criando alguns produtos e listando-os. O ponto de acesso criado pela extensão é, por padrão, http://localhost:5000/api/product
.
Como fizemos no tutorial anterior, testaremos usando a biblioteca requests
através do terminal.
1 |
>>> import requests
|
2 |
>>> import json
|
3 |
>>> res = requests.get('http://127.0.0.1:5000/api/product') |
4 |
>>> res.json() |
5 |
{u'total_pages': 0, u'objects': [], u'num_results': 0, u'page': 1} |
6 |
>>> d = {'name': u'iPhone', 'price': 549.00} |
7 |
>>> res = requests.post('http://127.0.0.1:5000/api/product', data=json.dumps(d), headers={'Content-Type': 'application/json'}) |
8 |
>>> res.json() |
9 |
{u'price': 549.0, u'id': 1, u'name': u'iPhone'} |
10 |
>>> d = {'name': u'iPad', 'price': 649.00} |
11 |
>>> res = requests.post('http://127.0.0.1:5000/api/product', data=json.dumps(d), headers={'Content-Type': 'application/json'}) |
12 |
>>> res.json() |
13 |
{u'price': 649.0, u'id': 2, u'name': u'iPad'} |
14 |
>>> res = requests.get('http://127.0.0.1:5000/api/product') |
15 |
>>> res.json() |
16 |
{u'total_pages': 1, u'objects': [{u'price': 549.0, u'id': 1, u'name': u'iPhone'}, {u'price': 649.0, u'id': 2, u'name': u'iPad'}], u'num_results': 2, u'page': 1} |
Como Customizar
É uma mão na roda ter as APIs RESTful criadas automaticamente, mas cada aplicação possui lógica de negócio própria que requer customização, validação e manipulação de requisições, etc.
Eis que preprocessors
e postprocessors
de requisições vem ao resgatte. Como o nome implica, métodos designados como pré-processadores exeutam antes do processamento da requisição e os pós-processadores executam após a requisição. create_api()
é onde devemos colocá-los, na forma de dicionário para o tipo de requisição (GET
, POST
, etc.) e os métodos como listas que agirão como pré- ou pós-processadores na requisição especificada. Abaixo temos um modelo:
1 |
manager.create_api( |
2 |
Product, |
3 |
methods=['GET', 'POST', 'DELETE'], |
4 |
preprocessors={ |
5 |
'GET_SINGLE': ['a_preprocessor_for_single_get'], |
6 |
'GET_MANY': ['another_preprocessor_for_many_get'], |
7 |
'POST': ['a_preprocessor_for_post'] |
8 |
},
|
9 |
postprocessors={ |
10 |
'DELETE': ['a_postprocessor_for_delete'] |
11 |
}
|
12 |
)
|
Requisições GET
, PUT
e PATCH
tem a flexibilidade de serem disparadas para registros únicos ou múltiplos, assim, possuem dois tipos cada. No código acima, note GET_SINGLE
e GET_MANY
para requisições GET
.
Os pré- e pós-processadores aceitam diversos tipos de parâmetros para cada tipo de requisição e funcionam sem qualquer retorno. Experimente essa parte por conta própria ;).
Conclusão
Nesse tutoral, vimos como criar uma API RESTful usando Flask ao adicionar algumas poucas linhas de código ao modelo baseado em SQLAlchemy.
Na próxima parte (e última), cobriremos como criar uma API RESTful usando outra extensão popular do Flask mas, dessa vez, a API será independente da ferramenta de modelagem usada para a base de dados.