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
WebSocket support for Flask

flask-sock WebSocket support for Flask Installation pip install flask-sock Example from flask import Flask, render_template from flask_sock import Soc

Miguel Grinberg 165 Dec 27, 2022
Quick and simple security for Flask applications

Note This project is non maintained anymore. Consider the Flask-Security-Too project as an alternative. Flask-Security It quickly adds security featur

Matt Wright 1.6k Dec 19, 2022
A nice anonymous messaging api (Uses Flask's restful api)

anonymous-message-api A nice anonymous message api (Uses Flask's restful api) How it works: 1. The user send a put request to your api server: Require

6 Nov 07, 2021
Freezes a Flask application into a set of static files.

Frozen-Flask Freezes a Flask application into a set of static files. The result can be hosted without any server-side software other than a traditiona

Frozen Flask 737 Dec 19, 2022
Set up a modern flask web server by running one command.

Build Flask App ยท Set up a modern flask web server by running one command. Installing / Getting started pip install build-flask-app Usage build-flask-

Kushagra Bainsla 5 Jul 16, 2022
Heroku Flask Setup

Heroku Flask Setup

Abhimanyu Haralukallu 0 Dec 07, 2021
Flask Boilerplate - Paper Kit Design | AppSeed

Flask Paper Kit Open-Source Web App coded in Flask Framework - Provided by AppSeed Web App Generator. App Features: SQLite database SQLAlchemy ORM Ses

App Generator 86 Nov 29, 2021
Live Corona statistics and information site with flask.

Flask Live Corona Info Live Corona statistics and information site with flask. Tools Flask Scrapy Matplotlib How to Run Project Download Codes git clo

Mohammad Dori 5 Jul 15, 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
A live chat built with python(flask + gevent + apscheduler) + redis

a live chat room built with python(flask / gevent / apscheduler) + redis Basic Architecture Screenshot Install cd /path/to/source python bootstrap.py

Limboy 309 Nov 13, 2022
This is a simple web application using Python Flask and MySQL database.

Simple Web Application This is a simple web application using Python Flask and MySQL database. This is used in the demonstration of development of Ans

Alaaddin Tarhan 1 Nov 16, 2021
A simple barcode and QR code generator built in Python with Flask.

โœจ Komi - Barcode & QR Generator โœจ A simple barcode and QR code generator built in Python with Flask. ๐Ÿ“‘ Table of Contents Usage Installation Contribut

Bonnie Fave 2 Nov 04, 2021
A Python chat app built with Flask that runs in the browser.

A Python chat app built with Flask that runs in the browser. Designed for local area networks that are not connected to the Internet.

Leonard Kleber 1 Dec 23, 2021
A Flask wrapper of Starknet state. Similar in purpose to Ganache.

Introduction A Flask wrapper of Starknet state. Similar in purpose to Ganache. Aims to mimic Starknet's Alpha testnet, but with simplified functionali

Shard Labs 159 Jan 04, 2023
A solid foundation for your flask app

Flask Foundation There is a cookiecutter version of this repo at https://github.com/JackStouffer/cookiecutter-Flask-Foundation. Documentation is locat

Jack Stouffer 1.3k Dec 11, 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
This repo contains the Flask API to expose model and get predictions.

Tea Leaf Quality Srilanka Chapter This repo contains the Flask API to expose model and get predictions. Expose Model As An API Model Trainig will happ

DuKe786 2 Nov 12, 2021
Guitar tabs web app for guitar fans, powered by Python/Flask

Guitar123 version 0.8.5 Guitar tabs web app for guitar fans, powered by Python/Flask Features Guitar tabs search and browse Easy to use for end user a

lowrain 48 Dec 27, 2022
A python package for integrating ripozo with Flask

flask-ripozo This package provides a dispatcher for ripozo so that you can integrate ripozo with Flask. As with all dispatchers it is simply for getti

Vertical Knowledge 14 Dec 03, 2018
Small flask based opds catalog designed to serve a directory via OPDS

teenyopds Small flask based opds catalog designed to serve a directory via OPDS, it has currently only been verified to work with KyBook 3 on iOS but

Adam Furbee 4 Jul 14, 2022