Flask-FileAlchemy
是一个 Flask 扩展,可让您使用 Markdown 或 YAML 格式的纯文本文件作为应用程序的主要数据存储。
$ pip install flask-filealchemy
与必须服务生产流量的应用程序相比,仅需要在本地运行的应用程序使用哪个数据存储的限制相当宽松。对于此类应用程序,为了易用性而牺牲性能通常是可以的。
这里的一个非常强大的用例是生成静态站点。虽然您可以使用 Frozen-Flask 将整个 Flask 应用程序“冻结”为一组 HTML 文件,但您的应用程序仍然需要从某处读取数据。这意味着您需要设置一个数据存储,该数据存储(本地)往往是基于文件的 SQLite。虽然这可以很好地完成这项工作,但这也意味着执行 SQL 语句来输入数据。
根据您拥有的数据模型的数量以及它们包含的类型,这可能很快就会失控(想象一下必须为博客文章编写INSERT
语句)。
此外,您无法对数据进行版本控制。好吧,从技术上讲是可以的,但是这些差异对人类来说没有任何意义。
Flask-FileAlchemy 允许您使用替代数据存储 - 纯文本文件。
纯文本文件的优点是更容易人类处理。另外,您可以对它们进行版本控制,以便您的应用程序数据和代码一起签入并共享历史记录。
Flask-FileAlchemy 允许您在 Markdown 或 YAML 格式的纯文本文件中输入数据,并根据您使用 Flask-SQLAlchemy 定义的 SQLAlchemy 模型加载它们,然后将该数据放入您正在使用的任何数据存储中(内存中的 SQLite效果最好),然后您的应用程序就可以随意查询。
这使您可以保留动态网站的舒适性,而不会影响静态网站的简单性。
使用标准 (Flask-)SQLAlchemy API 定义数据模型。作为示例, BlogPost
模型可以定义如下。
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 )
接下来,在磁盘上的某个位置创建一个data/
目录(为了简单起见,建议将此目录放在应用程序根目录中)。对于您定义的每个模型,在此data/
目录下创建一个与__tablename__
属性同名的目录。
我们目前支持三种不同的方式来定义数据。
第一种方式是在data/<__tablename__>/
目录下有多个 YAML 文件,每个文件对应一条记录。
对于“博客”示例,我们可以通过创建包含以下内容的文件data/blog_posts/first-post-ever.yml
来定义新的BlogPost
记录。
slug : first-post-ever
title : First post ever!
content : |
This blog post talks about how it's the first post ever!
在同一目录中添加更多此类文件将导致更多记录。
对于不超过 2-3 个字段的“较小”模型,Flask-FileAlchemy 支持从_all.yml
文件读取。在这种情况下,无需为每一行添加一个文件,只需添加表目录内_all.yml
文件中的所有行即可。
对于“博客”示例,如下所示。
- 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!
还可以从包含 Frontmatter 元数据的 Jekyll 风格 Markdown 文件加载数据。
对于博客示例,可以通过定义包含以下内容的data/blog_posts/first-post-ever.md
文件来创建新的BlogPost
记录。
---
slug : first-post-ever
title : First post ever!
---
This blog post talks about how it's the first post ever!
请注意,使用 Markdown 定义数据时,与主要 Markdown 正文关联的列的名称需要为content
。
最后,使用您的设置配置Flask-FileAlchemy
并要求它加载所有数据。
# 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
从给定目录读取数据,并将它们存储在您配置Flask-FileAlchemy
时选择的数据存储中(首选项为sqlite:///:memory:
)。
请注意,无法使用db.session
写入此数据库。好吧,从技术上讲这是允许的,但是您的应用程序所做的更改只会反映在内存数据存储中,而不会保留到磁盘中。
非常欢迎您的贡献!
请确保您已安装 Python 3.7+ 和 Poetry。
Git 克隆存储库 - git clone https://github.com/siddhantgoel/flask-filealchemy
。
安装开发所需的软件包poetry install
。
基本上就是这样。您现在应该能够运行测试套件 - poetry run pytest
。