1. Introdução
No meu trabalho, já uso o Flask-Potion há algum tempo, uma estrutura cujas principais vantagens são: integração muito conveniente com modelos SQLAlchemy, geração automática de terminais brutos, presença de um cliente de poção (muito conveniente se você escrever um serviço de API que precisará usar em outro serviço).
Notei que não há quase nada sobre a poção para frascos em russo, mas acho que essa estrutura pode parecer interessante para alguns.
Em vez de um artigo de revisão simples sobre essa estrutura, decidi escrever vários artigos sobre a criação de um sistema de controle para a biblioteca Furfur baseada em Flask-Potion.
Este sistema deve poder fazer o seguinte:
- Armazene informações sobre livros (isbn, título, descrição, autor, etc.)
- Armazenar informações do usuário (leitores e bibliotecários)
- Emitir um livro da biblioteca por um determinado período com a possibilidade de extensão
Neste sistema, usaremos as seguintes ferramentas:
- PostgreSQL
- Frasco, Frasco-SQLAlquimia, Frasco-JWT, Frasco-Poção, Frasco-Migração
Preparação
Esqueleto
Para não coletarmos o esqueleto do projeto, usaremos o modelo de corte de vale da Valefor, que inclui todas as dependências acima e muito mais.
cookiecutter gh:lemegetonx/valefor
Este modelo inclui dois aplicativos:
- aplicativo é a principal coisa. Ele contém funções de manipulador para jwt, classes mixin para recursos de poção e modelos sqlalchemy, além de um pacote com configurações para o aplicativo.
- usuário - no início do modelo, contém apenas o modelo do usuário.
Instalação de Dependências
O modelo usa poesia para resolver dependências, mas recentemente o pip também suporta pyproject.toml , portanto a escolha é sua. Vou tirar proveito da poesia.
poetry install
Configuração
Para configuração simplificada, o modelo usa a biblioteca sitri. Precisamos modificar um pouco a configuração do objeto Sitri.
- Mude app / config / provider.py . Substituiremos SystemCredentialProvider por YamlCredentialProvider para que os dados de autorização para sistemas de terceiros sejam obtidos do arquivo credential.yaml , que não adicionaremos às confirmações:
from sitri import Sitri from sitri.contrib.yaml import YamlConfigProvider, YamlCredentialProvider configuration = Sitri( config_provider=YamlConfigProvider(yaml_path="./config.yaml"), credential_provider=YamlCredentialProvider(yaml_path="./credential.yaml"), )
O PS mais sobre o que realmente está acontecendo aqui é mais fácil de ler na documentação , em suma, agora apenas decidimos de onde obteremos os dados para configuração e autorização.
- Como criamos essencialmente os mesmos provedores, é melhor substituir os sublinhados nas chaves na chamada get_credential por pontos em database.py .
DB_NAME = configuration.get_credential("db.name", path_mode=True) DB_HOST = configuration.get_credential("db.host", path_mode=True) DB_PASSWORD = configuration.get_credential("db.user.password", path_mode=True) DB_PORT = configuration.get_credential("db.port", path_mode=True) DB_USER = configuration.get_credential("db.user.name", path_mode=True)
Portanto, o arquivo config.yaml já estava no modelo, mas credential.yaml deve ser escrito por você. Na vida real, esses arquivos são necessariamente adicionados ao .gitignore, mas adicionarei o modelo credential.yaml ao repositório, para que sua estrutura seja compreensível para quem entra no projeto.
Credential.yaml base:
db: name: furfur_db host: localhost port: 5432 user: password: passwd name: admin
Banco de Dados
O próximo estágio de nossa preparação é a implantação do DBMS, neste caso o PostgreSQL. Por conveniência, criarei um arquivo stack.yaml onde descreverei o lançamento do contêiner do postgres com os dados de que precisamos.
version: '3.1' services: db: image: postgres restart: always environment: POSTGRES_PASSWORD: passwd POSTGRES_USER: admin POSTGRES_DB: furfur_db ports: - 5432:5432
Como mencionado anteriormente, o modelo valefor inclui o modelo básico de usuário necessário para o funcionamento do JWT (manipuladores); portanto, a etapa final na preparação do banco de dados é a migração (criação de uma tabela de usuário).
Estando na raiz do projeto, executamos os seguintes comandos:
export FLASK_APP=furfur.app flask db init flask db migrate flask db upgrade
Tudo, com a preparação do banco de dados, bem como a base geral do nosso sistema, estamos prontos.
O que vem a seguir?
Na próxima parte, falaremos sobre como organizar um sistema de funções simples e autenticação JWT.
Repositório do projeto: https://github.com/Egnod/furfur
Tudo o que é declarado nesta parte: https://github.com/Egnod/furfur/releases/tag/0.0.2