Flask-FileAlchemy
是燒瓶擴展名,可讓您使用Markdown或YAML格式的普通文本文件作為應用程序的主要數據存儲。
$ pip install flask-filealchemy
與必須在本地運行的應用程序,與必須提供生產流量的數據商店的限制非常放鬆。對於此類應用,通常可以犧牲性能以易於使用。
這裡的一種非常強的用例是生成靜態站點。雖然您可以使用冷凍屏幕將整個燒瓶應用程序“凍結”到一組HTML文件中,但您的應用程序仍然需要從某個地方讀取數據。這意味著您需要設置一個數據存儲,該數據存儲(本地)傾向於基於文件。雖然這做得非常好,但這也意味著執行SQL語句輸入數據。
根據您擁有多少個數據模型以及它們所包含的類型,這可能很快就會失控(想像一下必須為博客文章編寫INSERT
語句)。
此外,您無法版本控制數據。好吧,從技術上講,您可以,但是差異對人類沒有任何意義。
Flask -Filealchemy可讓您使用替代數據存儲 - 純文本文件。
純文本文件的優點是,人類更容易處理。另外,您可以版本控制它們,以便將應用程序數據和代碼一起簽入並共享歷史記錄。
Flask-Filealchemy使您可以在Markdown或Yaml格式的純文本文件中輸入數據,並根據您使用Blask-Sqlalchemy定義的Sqlalchemy模型加載它們,然後將此數據放入您使用的任何數據存儲(內存SQLITE)中最好的工作),然後準備好您的應用程序查詢,但是它令人愉悅。
這使您可以保留動態站點的舒適性,而不會損害靜態站點的簡單性。
使用標準(燒瓶)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__>/
Directory中擁有多個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!
也可以從包含前磨蝕的jekyll風格的標記文件中加載數據。
如果是博客示例,則可以通過定義具有以下內容的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定義數據時,與主賭注主體相關的列的名稱需要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+和詩歌。
Git克隆存儲庫git clone https://github.com/siddhantgoel/flask-filealchemy
。
安裝開發所需的軟件包 - poetry install
。
基本上就是這樣。現在,您應該能夠運行測試套件 - poetry run pytest
。