Flask-FileAlchemy
é uma extensão Flask que permite usar arquivos de texto simples formatados em Markdown ou YAML como o principal armazenamento de dados para seus aplicativos.
$ pip install flask-filealchemy
As restrições sobre qual armazenamento de dados usar para aplicativos que precisam ser executados apenas localmente são bastante relaxadas em comparação com aquelas que precisam atender ao tráfego de produção. Para tais aplicações, normalmente não há problema em sacrificar o desempenho pela facilidade de uso.
Um caso de uso muito forte aqui é a geração de sites estáticos. Embora você possa usar o Frozen-Flask para "congelar" um aplicativo Flask inteiro em um conjunto de arquivos HTML, seu aplicativo ainda precisa ler dados de algum lugar. Isso significa que você precisará configurar um armazenamento de dados, que (localmente) tende a ser SQLite baseado em arquivo. Embora isso funcione extremamente bem, também significa executar instruções SQL para inserir dados.
Dependendo de quantos modelos de dados você possui e dos tipos que eles contêm, isso pode rapidamente sair do controle (imagine ter que escrever uma instrução INSERT
para uma postagem de blog).
Além disso, você não pode controlar a versão dos seus dados. Bem, tecnicamente você pode, mas as diferenças não farão sentido para um humano.
Flask-FileAlchemy permite usar um armazenamento de dados alternativo - arquivos de texto simples.
Arquivos de texto simples têm a vantagem de serem muito mais fáceis de manusear por um ser humano. Além disso, você pode controlá-los por versão para que os dados e o código do seu aplicativo sejam verificados juntos e compartilhem o histórico.
O Flask-FileAlchemy permite-lhe inserir os seus dados em ficheiros de texto simples formatados em Markdown ou YAML e carregá-los de acordo com os modelos SQLAlchemy que definiu usando o Flask-SQLAlchemy Estes dados são então colocados em qualquer armazenamento de dados que estiver a usar (SQLite na memória funciona melhor) e estará pronto para seu aplicativo consultar da maneira que desejar.
Isso permite manter o conforto dos sites dinâmicos sem comprometer a simplicidade dos sites estáticos.
Defina seus modelos de dados usando a API padrão (Flask-)SQLAlchemy. Por exemplo, um modelo BlogPost
pode ser definido da seguinte forma.
app = Flask ( __name__ )
# configure Flask-SQLAlchemy
app . config [ 'SQLALCHEMY_DATABASE_URI' ] = 'sqlite:///:memory:'
db = SQLAlchemy ()
db . init_app ( app )
class BlogPost ( db . Model ):
__tablename__ = 'blog_posts'
slug = Column ( String ( 255 ), primary_key = True )
title = Column ( String ( 255 ), nullable = False )
content = Column ( Text , nullable = False )
Em seguida, crie um diretório data/
em algum lugar do seu disco (para simplificar, é recomendável ter esse diretório na raiz do aplicativo). Para cada modelo definido, crie um diretório neste diretório data/
com o mesmo nome do atributo __tablename__
.
Atualmente oferecemos suporte a três maneiras diferentes de definir dados.
A primeira maneira é ter vários arquivos YAML dentro do diretório data/<__tablename__>/
, cada arquivo correspondendo a um registro.
No caso do exemplo “blog”, podemos definir um novo registro BlogPost
criando o arquivo data/blog_posts/first-post-ever.yml
com o seguinte conteúdo.
slug : first-post-ever
title : First post ever!
content : |
This blog post talks about how it's the first post ever!
Adicionar mais arquivos desse tipo no mesmo diretório resultaria em mais registros.
Para modelos "menores" que não possuem mais de 2 a 3 campos, Flask-FileAlchemy suporta a leitura de um arquivo _all.yml
. Nesse caso, em vez de adicionar um arquivo para cada linha, simplesmente adicione todas as linhas no arquivo _all.yml
dentro do diretório da tabela.
Para o exemplo de "blog", seria semelhante ao seguinte.
- slug : first-post-ever
title : First post ever!
content : This blog post talks about how it's the first post ever!
- slug : second-post-ever
title : second post ever!
content : This blog post talks about how it's the second post ever!
Também é possível carregar dados de arquivos Markdown no estilo Jekyll contendo metadados do Frontmatter.
No caso do exemplo do blog, é possível criar um novo registro BlogPost
definindo um arquivo data/blog_posts/first-post-ever.md
com o seguinte conteúdo.
---
slug : first-post-ever
title : First post ever!
---
This blog post talks about how it's the first post ever!
Observe que ao definir dados usando markdown, o nome da coluna associada ao corpo principal do markdown precisa ser content
.
Por fim, configure Flask-FileAlchemy
com sua configuração e peça para carregar todos os seus dados.
# configure Flask-FileAlchemy
app . config [ 'FILEALCHEMY_DATA_DIR' ] = os . path . join (
os . path . dirname ( os . path . realpath ( __file__ )), 'data'
)
app . config [ 'FILEALCHEMY_MODELS' ] = ( BlogPost ,)
# load tables
FileAlchemy ( app , db ). load_tables ()
Flask-FileAlchemy
então lê seus dados de um determinado diretório e os armazena no armazenamento de dados de sua escolha com o qual você configurou Flask-FileAlchemy
(a preferência é sqlite:///:memory:
).
Observe que não é possível gravar neste banco de dados usando db.session
. Bem, tecnicamente é permitido, mas as alterações feitas pelo seu aplicativo serão refletidas apenas no armazenamento de dados na memória, mas não serão persistidas no disco.
Contribuições são muito bem-vindas!
Certifique-se de ter Python 3.7+ e Poetry instalados.
Git clone o repositório - git clone https://github.com/siddhantgoel/flask-filealchemy
.
Instale os pacotes necessários para a poetry install
.
É basicamente isso. Agora você deve ser capaz de executar o conjunto de testes - poetry run pytest
.