YAML-formatted plain-text file based models for Flask backed by Flask-SQLAlchemy

Overview

Flask-FileAlchemy

Flask-FileAlchemy is a Flask extension that lets you use Markdown or YAML formatted plain-text files as the main data store for your apps.

Installation

$ pip install flask-filealchemy

Background

The constraints on which data-store to use for applications that only have to run locally are quite relaxed as compared to the ones that have to serve production traffic. For such applications, it's normally OK to sacrifice on performance for ease of use.

One very strong use case here is generating static sites. While you can use Frozen-Flask to "freeze" an entire Flask application to a set of HTML files, your application still needs to read data from somewhere. This means you'll need to set up a data store, which (locally) tends to be file based SQLite. While that does the job extremely well, this also means executing SQL statements to input data.

Depending on how many data models you have and what types they contain, this can quickly get out of hand (imagine having to write an INSERT statement for a blog post).

In addition, you can't version control your data. Well, technically you can, but the diffs won't make any sense to a human.

Flask-FileAlchemy lets you use an alternative data store - plain text files.

Plain text files have the advantage of being much easier to handle for a human. Plus, you can version control them so your application data and code are both checked in together and share history.

Flask-FileAlchemy lets you enter your data in Markdown or YAML formatted plain text files and loads them according to the SQLAlchemy models you've defined using Flask-SQLAlchemy This data is then put into whatever data store you're using (in-memory SQLite works best) and is then ready for your app to query however it pleases.

This lets you retain the comfort of dynamic sites without compromising on the simplicity of static sites.

Usage

Define data models

Define your data models using the standard (Flask-)SQLAlchemy API. As an example, a BlogPost model can defined as follows.

app = Flask(__name__)

# configure Flask-SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'

db = SQLAlchemy(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)

Add some data

Next, create a data/ directory somewhere on your disk (to keep things simple, it's recommended to have this directory in the application root). For each model you've defined, create a directory under this data/ directory with the same name as the __tablename__ attribute.

We currently support three different ways to define data.

1. Multiple YAML files

The first way is to have multiple YAML files inside the data/<__tablename__>/ directory, each file corresponding to one record.

In case of the "blog" example, we can define a new BlogPost record by creating the file data/blog_posts/first-post-ever.yml with the following content.

slug: first-post-ever
title: First post ever!
content: |
  This blog post talks about how it's the first post ever!

Adding more such files in the same directory would result in more records.

2. Single YAML file

For "smaller" models which don't have more than 2-3 fields, Flask-FileAlchemy supports reading from an _all.yml file. In such a case, instead of adding one file for every row, simply add all the rows in the _all.yml file inside the table directory.

For the "blog" example, this would look like the following.

- 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!

3. Markdown/Frontmatter

It's also possible to load data from Jekyll-style Markdown files containing Frontmatter metadata.

In case of the blog example, it's possible to create a new BlogPost record by defining a data/blog_posts/first-post-ever.md file with the following content.

---
slug: first-post-ever
title: First post ever!
---

This blog post talks about how it's the first post ever!

Please note that when defining data using markdown, the name of the column associated with the main markdown body needs to be content.

4. Configure and load

Finally, configure Flask-FileAlchemy with your setup and ask it to load all your data.

# 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 then reads your data from the given directory, and stores them in the data store of your choice that you configured Flask-FileAlchemy with (the preference being sqlite:///:memory:).

Please note that it's not possible to write to this database using db.session. Well, technically it's allowed, but the changes your app makes will only be reflected in the in-memory data store but won't be persisted to disk.

Contributing

Contributions are most welcome!

Please make sure you have Python 3.5+ and Poetry installed.

  1. Git clone the repository - git clone https://github.com/siddhantgoel/flask-filealchemy.

  2. Install the packages required for development - poetry install.

  3. That's basically it. You should now be able to run the test suite - poetry run py.test.

Owner
Siddhant Goel
Software Developer 👨🏻‍💻
Siddhant Goel
Companion code to my O'Reilly book "Flask Web Development", second edition.

Flasky This repository contains the source code examples for the second edition of my O'Reilly book Flask Web Development. The commits and tags in thi

Miguel Grinberg 8k Dec 27, 2022
Glauth management ui created with python/flask

glauth-ui Glauth-UI is a small flask web app i created to manage the minimal glauth ldap server. I created this as i wanted to use glauth for authenti

Nils Thiele 67 Nov 29, 2022
REST API built using flask framework that used for managing bookmarks by individual users.

Bookmarks REST API REST API built using flask framework that used for managing bookmarks by individual users. API Consumers Note This app is built usi

Venkatesh Tantravahi 1 Dec 27, 2021
Map Matching & Weight Completion service - Java (Springboot) & Python(Flask)

Map Matching service to match coordinates to roads using Java and Springboot. Weight Completion service to fill in missing weights in a graph, using Python and Flask.

2 May 13, 2022
A YouTube webscraper made with flask.

YouTube Webscraper This website is for you to check all the stats on your favorite Youtube video! Technologies Python Flask HTML CSS Pafy Contributing

Proconsulates 3 Nov 25, 2021
SeCl - A really easy to deploy and use made-on Flask API to manage your files remotely from Terminal

SeCl SeCl it's a really easy to deploy and use made-on Flask API to manage your

ZSendokame 3 Jan 15, 2022
Example Flask application illustrating some of my common practices

Overholt Overholt is an example Flask application illustrating some of my common practices Development Environment At the bare minimum you'll need the

Matt Wright 1.6k Dec 15, 2022
Flask-redmail - Email sending for Flask

Flask Red Mail: Email Sending for Flask Flask extension for Red Mail What is it?

Mikael Koli 11 Sep 23, 2022
Mixer -- Is a fixtures replacement. Supported Django, Flask, SqlAlchemy and custom python objects.

The Mixer is a helper to generate instances of Django or SQLAlchemy models. It's useful for testing and fixture replacement. Fast and convenient test-

Kirill Klenov 870 Jan 08, 2023
5 Flask Projects To Get Started

5 Flask Projects Projects Made By Using Flask Projects List Rock Paper Scissor Game - A Simple Game Weather App - A OpenWeatherMap Scraper Task List -

Root_Arch 59 Dec 18, 2022
Seamlessly serve your static assets of your Flask app from Amazon S3

flask-s3 Seamlessly serve the static assets of your Flask app from Amazon S3. Maintainers Flask-S3 is maintained by @e-dard, @eriktaubeneck and @SunDw

Edd Robinson 188 Aug 24, 2022
A clean and simple blog system based on Flask and MongoDB

CleanBlog A clean and simple blog system based on Flask and MongoDB You can access CleanBlog This is the source code of Flask Tutorial Pro,you can buy

shin 107 Oct 06, 2022
Harmony, a discord clone, allows users to chat with other users in real time via servers, channels, and direct messages

Harmony, a discord clone, allows users to chat with other users in real time via servers, channels, and direct messages

Seth Holland 3 Feb 03, 2022
Socket.IO integration for Flask applications.

Flask-SocketIO Socket.IO integration for Flask applications. Installation You can install this package as usual with pip: pip install flask-socketio

Miguel Grinberg 4.9k Jan 02, 2023
Lux Academy & Data Science East Africa Python Boot Camp, Building and Deploying Flask Application Using Docker Demo App.

Flask and Docker Application Demo A Docker image is a read-only, inert template that comes with instructions for deploying containers. In Docker, ever

Harun Mbaabu Mwenda 11 Oct 29, 2022
An python flask app with webserver example

python-flask-example-keepalive How it works? Basically its just a python flask webserver which can be used to keep any repl/herokuapp or any other ser

KangersHub 2 Sep 28, 2022
docker-compose uWSGI nginx flask

docker-compose uWSGI nginx flask Note that this was tested on CentOS 7 Usage sudo yum install docker

Abdolkarim Saeedi 3 Sep 11, 2022
Intranet de la Rez Flask web app

IntraRez Application Flask de l'Intranet de la Rez. Exigences Python : Probablement = 3.10 à terme, pour l'instant = 3.8 suffit ; Autres packages Li

3 Jul 03, 2022
A Fast API style support for Flask. Gives you MyPy types with the flexibility of flask

Flask-Fastx Flask-Fastx is a Fast API style support for Flask. It Gives you MyPy types with the flexibility of flask. Compatibility Flask-Fastx requir

Tactful.ai 18 Nov 26, 2022
Control YouTube, streaming sites, media players on your computer using your phone as a remote.

Media Control Control Youtube, streaming sites, media players on your computer using your phone as a remote. Installation pip install -r requirements.

Shreyas Daniel 10 Dec 08, 2022