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.
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
Se tudo correr bem você terá a seguinte estrutura de pastas
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.
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
- Importação das bibliotecas de FastAPI e CORSMiddleware
- Array de
origins
permitidas - Função que retorna um instância de aplicação FastAPI com middleware CORS configurado
- Atribuição de uma instância de FastAPI à variável
app
- 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:
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
.
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"}
- Importação das rotas
- 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.