API Star: novo framework REST do criador do DRF

Python Sudeste - Abril - 2018

quem?

Luciano Ratamero

Python/JavaScript

lucianoratamero.github.io

@lucianoratamero

o que é o apistar

  • framework para APIs REST
  • python 3
  • performance
  • documentação
  • validação

(aqui você já pode scrollar pro lado direito ;D)

sobre o que iremos falar

  • views
  • schemas
  • documentação
  • integração com o django

começando!

  • pip install apistar
    apistar new .
    apistar run

welcome

  • http://localhost:8080/
    {"message": "Welcome to API Star!"}

welcome com nome

  • http://localhost:8080/?name=lulu
    {"message": "Welcome to API Star, lulu!"}

views

  • def welcome(name=None):
        if name is None:
            return {'message': 'Welcome to API Star!'}
        return {'message': 'Welcome to API Star, %s!' % name}

routes

  • from apistar import Include, Route
    from apistar.handlers import docs_urls, static_urls
    
    routes = [
        Route('/', 'GET', welcome),
        Include('/docs', docs_urls),
        Include('/static', static_urls)
    ]
    

docs

  • http://localhost:8080/docs/

typesystem e schemas

  • from apistar import typesystem
    
    class Nota(typesystem.Integer):
        description = 'Nota pro produto'
        minimum = 1
        maximum = 5
    
    class TamanhoDeProduto(typesystem.Enum):
        description = 'Acho que esse se explica'
        enum = ['pequeno', 'normal', 'grande']

objetos complexos

  • from apistar import typesystem
    
    class Produto(typesystem.Object):
        properties = {
            'nome': typesystem.string(description='Nome, cara. Nome.', min_length=1, max_length=100),
            'nota': Nota,
            'tamanho': TamanhoDeProduto,
        }
        required = ['nome', 'nota', 'tamanho']

de volta às docs

  • http://localhost:8080/docs/

sessão do banco de dados

  • from apistar import http
    from apistar.backends.django_orm import Session
    from src import schemas
    
    def criar_produto(produto: schemas.Produto, session: Session):
        if not produto:
            return http.Response(status=400)
        db_produto = session.Produto(**produto)
        db_produto.save()
        return http.Response(
            content=schemas.Produto(db_produto.__dict__),
            status=201
        )

banco de dados

  • sqlalchemy
  • django ORM

settings

  • settings = {
        'DATABASES': {
            'default': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': 'db.sqlite3',
            }
        },
        'INSTALLED_APPS': ['src', ]
    }

models == djangão

  • from django.db import models
    
    class Produto(models.Model):
        nota = models.PositiveSmallIntegerField()
        nome = models.CharField(max_length=100)
        tamanho = models.CharField(max_length=100)

criando tabelas == djangão

  • apistar makemigrations
    apistar migrate

validações customizadas

  • class CPFField(typesystem.String):
        min_length = 14
        max_length = 14
        pattern = "\d{3}\.\d{3}\.\d{3}-\d{2}"
    
        def __new__(cls, *args, **kwargs):
            cls.errors.update({'cpf_invalid': 'O CPF fornecido é inválido'})
            value = super().__new__(cls, *args, **kwargs)
            if not cpfcnpj.validate(value):
                raise TypeSystemError(cls=cls, code='cpf_invalid')
            return value

última visita às docs

  • http://localhost:8080/docs/

mas você falou de integração com o django...

  • sim #horadojabá

django_apistar

  • app Django
  • implicitamente faz o roteamento entre o API Star e o Django
  • funciona inteiramente dentro de uma aplicação Django
  • foco no código em vez de foco na configuração

instalando

  • pip install django_apistar
  • django>=1.8
  • apistar>=0.3.5
  • python>=3.6

configurando

  • settings.py
  • INSTALLED_APPS = (
        ...
        'django_apistar',
        'your_api_star_app',
        ...
    )
    
    APISTAR_SETTINGS = {
        'ALLOWED_DJANGO_ROUTES': ('/admin/', '/static/'),
    }
    
    APISTAR_ROUTE_CONF = 'your_api_star_app.routes'

performance

referências

dúvidas?

luciano@ratamero.com

cerveja/café