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 في الذاكرة يعمل بشكل أفضل) ومن ثم يصبح جاهزًا لتطبيقك للاستعلام كيفما يشاء.
يتيح لك ذلك الاحتفاظ براحة المواقع الديناميكية دون المساس ببساطة المواقع الثابتة.
حدد نماذج البيانات الخاصة بك باستخدام (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__
.
ندعم حاليًا ثلاث طرق مختلفة لتحديد البيانات.
الطريقة الأولى هي أن يكون لديك ملفات YAML متعددة داخل الدليل data/<__tablename__>/
، كل ملف يتوافق مع سجل واحد.
في حالة مثال "blog"، يمكننا تحديد سجل 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
.