Flask-FileAlchemy
— это расширение Flask, которое позволяет использовать текстовые файлы в формате Markdown или YAML в качестве основного хранилища данных для ваших приложений.
$ pip install flask-filealchemy
Ограничения на то, какое хранилище данных следует использовать для приложений, которые должны запускаться только локально, весьма смягчены по сравнению с теми, которые должны обслуживать производственный трафик. Для таких приложений обычно можно пожертвовать производительностью ради простоты использования.
Одним из очень сильных вариантов использования является создание статических сайтов. Хотя вы можете использовать Frozen-Flask для «заморозки» всего приложения Flask в наборе HTML-файлов, вашему приложению все равно необходимо откуда-то читать данные. Это означает, что вам нужно настроить хранилище данных, которое (локально) обычно представляет собой файловый SQLite. Хотя это делает свою работу очень хорошо, это также означает выполнение операторов SQL для ввода данных.
В зависимости от того, сколько у вас моделей данных и какие типы они содержат, это может быстро выйти из-под контроля (представьте, что вам нужно написать оператор INSERT
для сообщения в блоге).
Кроме того, вы не можете контролировать версии своих данных. Ну, технически можно, но различия не будут иметь никакого смысла для человека.
Flask-FileAlchemy позволяет использовать альтернативное хранилище данных — обычные текстовые файлы.
Преимущество обычных текстовых файлов состоит в том, что с ними гораздо проще обращаться человеку. Кроме того, вы можете контролировать их версии, чтобы данные и код вашего приложения проверялись вместе и делились историей.
Flask-FileAlchemy позволяет вводить данные в обычные текстовые файлы в формате Markdown или YAML и загружать их в соответствии с моделями SQLAlchemy, которые вы определили с помощью Flask-SQLAlchemy. Эти данные затем помещаются в любое используемое вами хранилище данных (SQLite в памяти). работает лучше всего), а затем готово к тому, чтобы ваше приложение могло запрашивать его по своему усмотрению.
Это позволяет сохранить удобство динамических сайтов без ущерба для простоты статических сайтов.
Определите свои модели данных, используя стандартный API (Flask-)SQLAlchemy. Например, модель 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, каждый файл соответствует одной записи.
В случае примера «блог» мы можем определить новую запись BlogPost
, создав файл data/blog_posts/first-post-ever.yml
со следующим содержимым.
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!
Также можно загружать данные из файлов Markdown в стиле Jekyll, содержащих метаданные Frontmatter.
В случае с примером блога можно создать новую запись BlogPost
, определив файл data/blog_posts/first-post-ever.md
со следующим содержимым.
---
slug : first-post-ever
title : First post ever!
---
This blog post talks about how it's the first post ever!
Обратите внимание, что при определении данных с использованием уценки имя столбца, связанного с основным телом уценки, должно быть 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
.