Flask-FileAlchemy
est une extension Flask qui vous permet d'utiliser des fichiers en texte brut au format Markdown ou YAML comme magasin de données principal pour vos applications.
$ pip install flask-filealchemy
Les contraintes sur le stockage de données à utiliser pour les applications qui doivent uniquement s'exécuter localement sont assez assouplies par rapport à celles qui doivent servir le trafic de production. Pour de telles applications, il est normalement acceptable de sacrifier les performances au profit de la facilité d'utilisation.
Un cas d’utilisation très important ici est la génération de sites statiques. Bien que vous puissiez utiliser Frozen-Flask pour « geler » une application Flask entière dans un ensemble de fichiers HTML, votre application doit toujours lire les données quelque part. Cela signifie que vous devrez configurer un magasin de données, qui (localement) a tendance à être basé sur des fichiers SQLite. Bien que cela fasse extrêmement bien le travail, cela signifie également exécuter des instructions SQL pour saisir des données.
En fonction du nombre de modèles de données dont vous disposez et des types qu'ils contiennent, cela peut rapidement devenir incontrôlable (imaginez devoir écrire une instruction INSERT
pour un article de blog).
De plus, vous ne pouvez pas contrôler la version de vos données. Eh bien, techniquement, c'est possible, mais les différences n'auront aucun sens pour un humain.
Flask-FileAlchemy vous permet d'utiliser un magasin de données alternatif : des fichiers en texte brut.
Les fichiers texte brut ont l’avantage d’être beaucoup plus faciles à gérer pour un humain. De plus, vous pouvez les contrôler de version afin que les données et le code de votre application soient tous deux archivés ensemble et partagent l'historique.
Flask-FileAlchemy vous permet de saisir vos données dans des fichiers de texte brut au format Markdown ou YAML et de les charger selon les modèles SQLAlchemy que vous avez définis à l'aide de Flask-SQLAlchemy. Ces données sont ensuite placées dans le magasin de données que vous utilisez (SQLite en mémoire fonctionne mieux) et est ensuite prêt à être interrogé par votre application comme bon lui semble.
Cela vous permet de conserver le confort des sites dynamiques sans compromettre la simplicité des sites statiques.
Définissez vos modèles de données à l'aide de l'API standard (Flask-)SQLAlchemy. A titre d'exemple, un modèle BlogPost
peut être défini comme suit.
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 )
Ensuite, créez un répertoire data/
quelque part sur votre disque (pour simplifier les choses, il est recommandé d'avoir ce répertoire à la racine de l'application). Pour chaque modèle que vous avez défini, créez un répertoire sous ce répertoire data/
avec le même nom que l'attribut __tablename__
.
Nous prenons actuellement en charge trois manières différentes de définir les données.
La première consiste à avoir plusieurs fichiers YAML dans le répertoire data/<__tablename__>/
, chaque fichier correspondant à un enregistrement.
Dans le cas de l'exemple "blog", nous pouvons définir un nouvel enregistrement BlogPost
en créant le fichier data/blog_posts/first-post-ever.yml
avec le contenu suivant.
slug : first-post-ever
title : First post ever!
content : |
This blog post talks about how it's the first post ever!
L'ajout de davantage de fichiers de ce type dans le même répertoire entraînerait davantage d'enregistrements.
Pour les modèles « plus petits » qui n'ont pas plus de 2-3 champs, Flask-FileAlchemy prend en charge la lecture à partir d'un fichier _all.yml
. Dans un tel cas, au lieu d'ajouter un fichier pour chaque ligne, ajoutez simplement toutes les lignes du fichier _all.yml
dans le répertoire de la table.
Pour l’exemple « blog », cela ressemblerait à ce qui suit.
- 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!
Il est également possible de charger des données à partir de fichiers Markdown de style Jekyll contenant des métadonnées Frontmatter.
Dans le cas de l'exemple de blog, il est possible de créer un nouvel enregistrement BlogPost
en définissant un fichier data/blog_posts/first-post-ever.md
avec le contenu suivant.
---
slug : first-post-ever
title : First post ever!
---
This blog post talks about how it's the first post ever!
Veuillez noter que lors de la définition de données à l'aide de markdown, le nom de la colonne associée au corps principal de markdown doit être content
.
Enfin, configurez Flask-FileAlchemy
avec votre configuration et demandez-lui de charger toutes vos données.
# 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
lit ensuite vos données dans le répertoire donné et les stocke dans le magasin de données de votre choix avec lequel vous avez configuré Flask-FileAlchemy
(la préférence étant sqlite:///:memory:
).
Veuillez noter qu'il n'est pas possible d'écrire dans cette base de données en utilisant db.session
. Eh bien, techniquement, c'est autorisé, mais les modifications apportées par votre application ne seront reflétées que dans le magasin de données en mémoire, mais ne seront pas conservées sur le disque.
Les contributions sont les bienvenues !
Veuillez vous assurer que Python 3.7+ et Poetry sont installés.
Git clone le référentiel - git clone https://github.com/siddhantgoel/flask-filealchemy
.
Installez les packages requis pour l' poetry install
.
C'est essentiellement ça. Vous devriez maintenant pouvoir exécuter la suite de tests - poetry run pytest
.