Ir para o conteúdo

Criar e configurar o Workspace

Inicialmente vamos desenvolver o finance-api, que proverá uma API com um conjunto de recursos destinados a persistência e disponibilização dos dados. Para isso como já foi relatado, será utilizado o framework Python FastAPI.

Dica

Antes de prosseguir verifique se o Python e o Poetry estão instalados e configurados em seu sistema, os tutoriais: Instalação e configuração do ambiente Python 3 e Aprenda como criar um projeto Python com Poetry podem lhe auxiliar com isso.

Criar o workspace (diretório de trabalho) da aplicação

Em sua pasta de usuário ou local de sua preferência, crie o projeto, bem como a estrutura de diretórios (pastas) da aplicação. A estrutura definida facilitará a organização do código da aplicação.

Não se preocupe em entender tudo agora, a medida que formos desenvolvendo a aplicação tudo fará sentido.

$ mkdir finance-app; cd finance-app

Usando o Poetry para criação do projeto

Nota

Em caso de dúvidas sobre como criar e ativar um ambiente virtual, consulte Aprenda como criar um projeto Python com Poetry

$ poetry new --name app finance-api
Created package app in finance-api

$ mkdir finance-api/app/api \
finance-api/app/core \
finance-api/app/db \
finance-api/app/models \
finance-api/app/services

Se tudo correr bem você terá a seguinte estrutura de pastas

$ tree finance-api
finance-api
├── README.rst
├── app
│   ├── __init__.py
│   ├── api
│   ├── core
│   ├── db
│   ├── models
│   └── services
├── pyproject.toml
└── tests
    ├── __init__.py
    └── test_app.py

7 directories, 5 files

Criar e ativar o ambiente virtual

Seguindo o que se considera uma "boa prática" no desenvolvimento de sistemas Python, o próximo passo consiste na criação de um Ambiente virtual (.venv), permitindo ao programador o gerenciamento das dependências do projeto de forma exclusiva.

$ cd finance-api
$ poetry install

Creating virtualenv app in /Users/jeancarlosdanese/test_ap/finance-app/finance-api/.venv
<span style="color: BlueViolet;">Updating dependencies</span>
<span style="color: BlueViolet;">Resolving dependencies... </span><span style="color: gray;">(1.2s)</span>

<span style="color: BlueViolet;">Writing lock file</span>

<span style="font-weight: bold;">Package operations:</span> <span style="color: BlueViolet;">8</span> installs, <span style="color: BlueViolet;">0</span> updates, <span style="color: BlueViolet;">0</span> removals

  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">pyparsing</span> (<span style="color: LimeGreen;">3.0.9</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">attrs</span> (<span style="color: LimeGreen;">21.4.0</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">more-itertools</span> (<span style="color: LimeGreen;">8.13.0</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">packaging</span> (<span style="color: LimeGreen;">21.3</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">pluggy</span> (<span style="color: LimeGreen;">0.13.1</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">py</span> (<span style="color: LimeGreen;">1.11.0</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">wcwidth</span> (<span style="color: LimeGreen;">0.2.5</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">pytest</span> (<span style="color: LimeGreen;">5.4.3</span>)

<span style="font-weight: bold;">Installing</span> the current project: <span style="color: cyan;">app</span> (<span style="color: LimeGreen;">0.1.0</span>)

$ source .venv/bin/activate
(.venv) $

Nota

O poetry cria o ambiente virtual de forma automática. Após a execução de source .venv/bin/activate observe prompt de comando (.venv) $, que pode variar dependendo da configuração da variável PS1="$ " (no exemplo), em ambiente 'Shell Session' (Linux). O (.venv) indica a utilização do ambiente virtual.

Instalar ou adicionar dependências ao projeto

Serão necessários muitos pacotes (dependências) para o completo desenvolvimento do aplicativo (API) finance-api, no entanto precisamos apenas de alguns para iniciar o servidor. A medida da necessidade outras dependências podem ser adicionadas ao projeto.

Adicionar dependências com Poetry

$ $ poetry add fastapi~0.68 uvicorn^0.14 email-validator^1.2

<span style="color: BlueViolet;">Updating dependencies</span>
<span style="color: BlueViolet;">Resolving dependencies... </span><span style="color: gray;">(0.9s)</span>

<span style="color: BlueViolet;">Writing lock file</span>

<span style="font-weight: bold;">Package operations:</span> <span style="color: BlueViolet;">11</span> installs, <span style="color: BlueViolet;">0</span> updates, <span style="color: BlueViolet;">0</span> removals

  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">typing-extensions</span> (<span style="color: LimeGreen;">4.2.0</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">asgiref</span> (<span style="color: LimeGreen;">3.5.2</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">click</span> (<span style="color: LimeGreen;">8.1.3</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">dnspython</span> (<span style="color: LimeGreen;">2.2.1</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">h11</span> (<span style="color: LimeGreen;">0.13.0</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">idna</span> (<span style="color: LimeGreen;">3.3</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">pydantic</span> (<span style="color: LimeGreen;">1.9.1</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">starlette</span> (<span style="color: LimeGreen;">0.14.2</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">email-validator</span> (<span style="color: LimeGreen;">1.2.1</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">fastapi</span> (<span style="color: LimeGreen;">0.68.2</span>)
  <span style="color: LimeGreen;">•</span> Installing <span style="color: cyan;">uvicorn</span> (<span style="color: LimeGreen;">0.14.0</span>)

O que está sendo instalado:

  • fastapi - framework que será usando para construir o finance-api;
  • uvicorn - servidor ASGI que usaremos para servir o aplicativo (API);
  • email-validator - permite ao pydantic validar e-mails.

Depois de adicionar as dependências, confira como ficou o arquivo ../finance-api/pyproject.toml.

../finance-api/pyproject.toml

...

[tool.poetry.dependencies]
python = "^3.10"
fastapi = "~0.68"
uvicorn = "^0.14"
email-validator = "^1.2"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

...

Desenvolvimento da Aplicação (API)

Criar o SERVIDOR

Por fim deve ser criado um arquivo Python responsável por prover o servidor da aplicação.

$ touch app/__init__.py
$ touch app/server.py

Onde:

__init__.py → faz com que o Python trate o diretório que o contém como um pacote

server.py → arquivo principal da aplicação

# app/server.py

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware    # (1)


origins = [
    "http://localhost",     # (2)
]


def get_application():
    app = FastAPI(title="Finance API", version="1.0.0")
    app.add_middleware(
        CORSMiddleware,
        allow_origins=origins,                 # (3)
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

    return app


app = get_application()      # (4)


@app.get("/")
async def root():                        # (5)
    return {"message": "Hello World"}
  1. Importação das bibliotecas de FastAPI e CORSMiddleware
  2. Array de origins permitidas
  3. Função que retorna um instância de aplicação FastAPI com middleware CORS configurado
  4. Atribuição de uma instância de FastAPI à variável app
  5. Rota inicial do aplicativo. Rota raiz (/)

Iniciar a aplicação

$ uvicorn app.server:app --reload
<span style="color: LimeGreen;">INFO</span>:     Uvicorn running on <span style="font-weight: bold;">http://127.0.0.1:8000</span> (Press CTRL+C to quit)
<span style="color: LimeGreen;">INFO</span>:     Started reloader process [<span style="font-weight: bold; color: cyan;">28321</span>] using <span style="font-weight: bold; color: cyan;">statreload</span>
<span style="color: LimeGreen;">INFO</span>:     Started server process [<span style="color: cyan;">28369</span>]
<span style="color: LimeGreen;">INFO</span>:     Waiting for application startup.
<span style="color: LimeGreen;">INFO</span>:     Application startup complete.

Abre o browser de sua preferência e acesso o http://127.0.0.1:8000, você deverá receber uma mensagem (json) como:

{
  "message": "Hello World"
}

Dica

Pode ser que a mensagem retorne sem formatação, ex: {"message":"Hello World"}, isso não é um problema e se você desejar, pode instalar uma extensão (extension) como JSON Viewer em seu navegador.

Definir rotas (routes)

O próximo passo é definir algumas rotas para o aplicativo, por se tratar de um sistema de gestão financeira, iniciaremos pelas rotas relacionadas aos movements (movimentos).

Vamos começar criando uma nova pasta chamada routes dentro de app/api e dentro desta os arquivos __init__.py* e movements.py.

$ mkdir app/api/routes
$ touch app/api/routes/__init__.py app/api/routes/movements.py

No arquivo app/api/routes/movements.py vamos adicionar o seguinte código:

# app/api/routes/movements.py

from typing import List
from fastapi import APIRouter

router = APIRouter()


@router.get("/")
async def get_all() -> List[dict]:
    movements = [
        {"id": 1, "category": "Habitação", "description": "Aluguel", "value": 800.0},
        {"id": 2, "category": "Transporte", "description": "Combustível", "value": 280.0},
        {"id": 3, "category": "Educação", "description": "Curso do Programação", "value": 190.0, },
    ]

    return movements

No arquivo app/api/routes/__init__.py, o código será o seguinte:

# app/api/routes/__init__.py

from fastapi import APIRouter
from app.api.routes.movements import router as movements_router

router = APIRouter()
router.include_router(movements_router, prefix="/movements", tags=["movements"])

Agora que já criamos uma rota para nossa API, precisamos configurá-la no arquivo principal da aplicação, no caso app/server.py, que ficará com seguinte codificação:

# app/server.py

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from app.api.routes import router as api_router    # (1)

origins = [
    "http://localhost",
]


def get_application():
    app = FastAPI(title="finance API", version="1.0.0")
    app.add_middleware(
        CORSMiddleware,
        allow_origins=origins,
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

    app.include_router(api_router, prefix="/api")    # (2)

    return app


app = get_application()


@app.get("/")
async def root():
    return {"message": "Hello World"}
  1. Importação das rotas
  2. Inclusão das rotas na aplicação com o prefixo /api

Através de seu navegador preferido acesse http://127.0.0.1:8000/api/movements/, você deverá receber uma resposta como esta:

[
  {
    "id": 1,
    "category": "Habitação",
    "description": "Aluguel",
    "value": 800.0
  },
  {
    "id": 2,
    "category": "Transporte",
    "description": "Combustível",
    "value": 280.0
  },
  {
    "id": 3,
    "category": "Educação",
    "description": "Curso do Programação",
    "value": 190.0
  }
]

O que aprendemos?

Neste post aprendemos como criar um projeto Python com o Poetry, também definimos estrutura de diretório da aplicação, ativação do ambiente virtual e como utilizar o poetry, para fazer o gerenciamento das dependências do projeto. Por fim iniciamos o desenvolvimento de uma aplicação FastAPI que será ao final desta série uma API para o sistema de gestão finance-ui.

Referências

FastAPI. Site. Online disponível em: fastapi.tiangolo.com. Acesso em 05/06/2021. Uvicorn. Site. Online disponível em: www.uvicorn.org. Acesso em 05/06/2021.