Advertisement
  1. Code
  2. Flask

Construindo APIs RESTful Com Flask: ORM Com SQLAlchemy

Scroll to top
Read Time: 3 min
This post is part of a series called Building RESTful APIs With Flask.
Building RESTful APIs With Flask: The DIY Approach
Building RESTful APIs With Flask: ORM Independent

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.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.