flask_cms استخدام المُخطّطات Blueprints في تطبيقات Flask


مُقدّمة

بعد أن تعرّفنا على بنية التّطبيق الذي سنبنيه سويًّا باستخدام إطار العمل Flask ولغة Python، سننتقل الآن إلى العمل على تجهيز بيئة وهميّة لبايثون 3 لنقوم بتنصيب إطار Flask عليها ونبدأ بتطوير التّطبيق بمعزل عن النّظام المتواجد في الحاسوب، بعد تهيئة البيئة البرمجيّة، سنتعرّف على كيفيّة استغلال مبدأ المُخطّطات Blueprints التّي يُوفرّها لنا إطار العمل Flask لتوزيع أفضل لملفّات ومُوجّهات التّطبيق لعزل كل جزء وظيفيّ عن الأجزاء الأخرى وبالتّالي تسهيل تطوير خصائص وميّزات وكذلك تقسيم المُهمّات على أفراد الفريق البرمجي في حالة كنت تعمل على تطبيق مع أكثر من مُطوّر.

main.png

 

إنشاء بيئة وهميّة بأداة Pyvenv

أولا، سنحتاج إلى إنشاء بيئة وهميّة لعزل اعتماديات التّطبيق عن اعتماديات النّظام، وبما أنّ لديك خبرة في لغة بايثون، فلا بد بأنّك تُفكّر في استخدام أداة virtualenv، يُمكنك استخدامها إن أردت، لكنّنا سنستعمل بايثون 3 في تطويرنا لهذا التّطبيق، وإذا اتّبعت الدّرس
الذي أشرت إليه في الدّرس السّابق، فستعلم بأنّه من المُفضّل استعمال أداة pyvenv للتأكّد من أنّ البيئة الوهميّة ستكون خاصّة بلغة بايثون 3 وليس بايثون 2.

اتّبع الطّريقة التّقليديّة لإنشاء بيئة وهميّة باستعمال أداة pyvenv عبر السّطر التّالي:

pyvenv venv

إذا كنت تستخدم نظام Windows فقد لا يعمل السّطر أعلاه، لكن يُمكنك استخدام الأمر التّالي عوضا عنه:

python -m venv

فقط تأكّد من أنّ الأمر python يوصلك إلى مُفسّر بايثون 3 وليس مُفسّر بايثون 2.

بعد انتهاء الأمر من التّنفيذ، قم بتفعيل البيئة الوهميّة بالسّطر التّالي:

source venv/bin/activate

بعد تفعيل البيئة الوهميّة، قم بتنصيب إطار العمل Flask باستخدام أداة pip بالسّطر التّالي:

pip install Flask

إذا كان السّطر ما قبل الأخير من المُخرجات كما يلي، فهذا يعني بأنّ كل شيء بخير:

Successfully installed Flask itsdangerous Jinja2 Werkzeug click MarkupSafe

طريقة العمل

بما أنّنا أصبحنا نتعامل مع الكثير من الملفّات، عليك أن تعرف أي شيفرة ستكون في أي ملف، ولهذا سأقوم بوضع مسار الملف في أعلى الشّيفرة على شكل تعليق.

وفي معظم الأحيان، لن أضع محتويات الملف كاملًا، بل سأضع الشيفرة الجديدة مُحاطة بسطرين قديمين من الأعلى والأسفل لتُدرك أي مكان يجب عليك أن تضع به الشّيفرة.

مثال على الشّيفرة سيكون كالآتي:

# project/users/views.py

@users.route('/login')
def login():
    .
    .
    .
    login_user(user)
    return redirect(url_for('users.posts_by_author'))

لا تقلق إن لم تفهم الأجزاء الجديدة عليك من الشّيفرة، فهي مُجرّد مثال بسيط على كيفيّة استخدام مُوجّه لمُخطّط وكيفيّة الرّبط بين الموجّهات.

إنشاء المُخطّطات

لدينا الآن مُخطّطان في تطبيقنا، واحد في مجلد المُستخدمين والآخر في مُجلّد المقالات.

سنقوم أولا بإنشاء المُخطّط الخاصّ بالمُستخدمين في ملفّ views.py المتواجد داخل المُجلّد users كما يلي:

# project/users/views.py

from flask import Blueprint

users = Blueprint('users', __name__, template_folder='templates', url_prefix='/users')

في السّطر الأول، نستدعي Blueprint من حزمة flask، ونقوم بإنشاء كائن منها كما كنّا نقوم بإنشاء كائن app من الصّنف Flask في الماضي.
المعامل الأول عبارة عن اسم المُخطّط، والمعامل الثّالث هدفه إخبار فلاسك بأنّ مُجلّد القوالب سيكون في نفس مُجلّد المُخطّط، وسيكون باسم templates ويُمكنك تغيير هذا الاسم إلى ما تشاء، لكنّنا لن نقوم بذلك، ومن المُفضّل اتّباع المُمارسات الشّائعة في مثل هذه الأمور.
أمّا مُعامل url_prefix فالهدف منه وضع موجّه رئيسي قبل الموجّه المعرّف.

مثلًا لتعريف الموجّه الرّئيسي / سيكون كالآتي:

@users.route('/') # /users

ولتعريف موجّه التّسجيل:

@users.route('/register') # /users/register

وكما تُلاحظ، لا أحتاج إلى تعريف /users في بداية كل مُوجّه.

لو لم نُخصّص مُجلّدًا للقوالب، لكان علينا جمع جميع ملفّات HTML في مجلّد project/templates.
هناك كذلك خيار لتفريق مجلّد الملفّات السّاكنة بنفس الطّريقة:

users = Blueprint('users', __name__, template_folder='templates', static_folder='static', url_prefix='/users')

ولأنّنا سنجمع جميع الملفّات السّاكنة في مُجلّد project/static فهذا الخيار لن يكون مُفيدًا لنا.

يُمكنك الآن إنشاء المُخطّط الخاصّ بالمقالات بنفس الطّريقة.

# project/posts/views.py

from flask import Blueprint

posts = Blueprint('posts', __name__, template_folder='templates', url_prefix='/posts')

تسجيل المُخطّطات مع التّطبيق الرّئيسي

بعد أن قُمنا بإنشاء مُخطّطات، حان الوقت لإخبار إطار فلاسك بأنّ هذه المُخّططات تابعة للتّطبيق، وطريقة القيام بذلك بسيطة.
افتح الملف project/__init__.py وضع به ما يلي:

# project/__init__.py
from flask import Flask

app = Flask(__name__)

from project.posts.views import posts
from project.users.views import users

app.register_blueprint(posts)
app.register_blueprint(users)

@app.route('/')
def index():
    return 'Project Index'

السّطران الأولان معروف بأنّهما لإنشاء التّطبيق، أمّا الاستدعاءات فهي لاستدعاء المُتغيّرين اللذين يحملان المُخطّطان، أمّا الأسطر الأخيرة فهي لتسجيل المُخطّطات التّي استدعيناها.

أمّا الموجّه الذي عرّفته في الأسفل فهو ليتمكّن المُستخدم من الوصول إلى الصّفحة الرّئيسية دون الحصول على خطأ من نوع 404.
ذلك لأنّ الموجّهات التّي سنعرّفها في المُخطّطات ستكون كما يلي:

/posts
/posts/new
/users
/users/register
.
.
.

لذا إن دخل المُستخدم إلى العنوان 127.0.0.1:5000 فلن يجد شيئا لأنّنا لم نُحدّد الموجّه الرّئيسي /، وهذا هو السّبب الذي جعلنا نُضيف المُوجّه بملفّ __init__.py في مجلّد المشروع project.

إنشاء مُوجّهين رئيسيّين

قلنا سابقًا بأنّ المُوجّهات ستكون داخل ملفّات views.py فإن أردنا أن نعرّف مثلًا موجّهًا للمقالات الرّئيسية، فسنقوم بذلك في ملّف posts/views.py أمّا الخاص بالمُستخدمين فسيكون في ملفّ users/views.py وهكذا.

سنقوم الآن بإنشاء مُوجّه رئيسي لكل مُخطّط.

أولا موجّه /posts/ سيكون كما يلي (ضعه مُباشرة بعد سطر تعريف المُتغيّر posts):

# project/posts/views.py

@posts.route('/') # 127.0.0.1:5000/posts
def index():
    return 'Posts Index'

أمّا المُوجّه الخاصّ بالمُستخدمين فسيكون كما يلي:

# project/users/views.py

@users.route('/') # 127.0.0.1:5000/users
def index():
    return 'Users Index'

وبهذه التّغييرات سيُصبح الملفّ views.py الخاصّ بالمُستخدمين كما يلي:

from flask import Blueprint

users = Blueprint('users', __name__, template_folder='templates', url_prefix='/users')

@users.route('/') # 127.0.0.1:5000/users
def index():
    return 'Users Index'

وملفّ views.py الخاص بالمقالات سيكون كالآتي:

from flask import Blueprint

posts = Blueprint('posts', __name__, template_folder='templates', url_prefix='/posts')

@posts.route('/') # 127.0.0.1:5000/posts
def index():
    return 'Posts Index'

تشغيل الخادوم

بعد أن قمنا بتسجيل المُخطّطات وأنهينا أساسيّات التّطبيق، علينا أن نقوم بتشغيل الخادوم لنتمكّن من مُعاينة ما قُمنا به، ولتشغيل التّطبيق، سنضع السّطر المسؤول عن الأمر في ملفّ باسم run.py في مجلّد kalima.

محتويات الملفّ ستكون كالتّالي:

# run.py

from project import app

app.run(debug=True)

كما تُلاحظ، استدعينا الكائن app الذي سبق وأن عرّفناه في ملفّ project/__init__.py بعدها نقوم بتشغيل الخادوم بالطّريقة المُعتادة مع خيار تصحيح الأخطاء.

بعد حفظ ملفّ run.py يُمكنك تشغيله عبر سطر الأوامر:

$ python run.py

ستُلاحظ بأنّ الخادوم قد بدأ بالاشتغال كما العادة، لكنّ طريقة تشغيل الخادوم بهذه الطّريقة غير منصوح بها لأنّ النّسخة رقم 0.11 من Flask التّي أطلقت في أواخر عام 2016 جاءت بطريقة جديدة لتشغيل الخادوم عبر تنفيذ الأمر flask run.

لكن الأمر flask run لن يعمل إلّا بعد تحديد اسم الحزمة أو الوحدة التّي يتواجد بها تطبيق Flask، وذلك عبر تعريف مُتغيّر بيئة باسم FLASK_APP وإعطائه القيمة حسب مكان تواجد تطبيق Flask الخاص بك.
لتعريف مُتغيّر البيئة يُمكنك تنفيذ الأمر التّالي من الطّرفيّة بعد التّأكد من أنّ البيئة الوهميّة لديك مُفعّلة:

$ export FLASK_APP=app.py

في نظام Windows يجب عليك استخدام الكلمة المفتاحيّة set عوضا عن export:

> set FLASK_APP=app.py

في المثال أعلاه، نفترض بأنّ شيفرة تطبيق Flask مُتواجدة في الملفّ app.py.

بعد تعريف مُتغيّر البيئة يُمكنك تشغيل الخادوم عبر تنفيذ الأمر التّالي:

flask run

عوضًا عن الأمر:

python app.py

في مشروعنا، تطبيق Flask مُتواجد داخل ملفّ __init__.py في مُجلّد project لذا فطريقة تعيين مُتغيّر البيئة سيكون كالتّالي:

$ export FLASK_APP=project/__init__.py

بعد تحديد مُتغيّر البيئة، يُمكنك تجربة تشغيل الخادوم:

flask run

بعد تنفيذك للأمر أعلاه، يجب أن تحصل على مُخرج كما يلي:

 * Serving Flask app "project"
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

لتفعيل مُصحّح الأخطاء، كل ما عليك فعله هو تعريف مُتغيّر البيئة FLASK_DEBUG وتعيين القيمة 1 له:

export FLASK_DEBUG=1 

مُلاحظة: أذكّر بأنّ تفعيل مُصحّح الأخطاء في بيئة الإنتاج أمر خطير، ولا يجب عليك أبدًا أن تقوم بذلك حتى ولو كنت مُتأكّدًا من أنّ تطبيقك خال من الأخطاء، وعليك أن تُدرك بأنّ مُصحّح الأخطاء مصمّم لمُساعدتك على تطوير واختبار التّطبيق وليس لتفعيله بعد نشر التّطبيق على الأنترنت.

ومُجدّدًا، استبدل export بالكلمة set إذا كنت تستخدم نظام Windows.

بعد تشغيل الخادوم مع وضع تصحيح الأخطاء، فسيكون المُخرج مُشابها لما يلي:

 * Serving Flask app "project"
 * Forcing debug mode on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 573-756-626

وإن أردت أن يصل الآخرون في شبكتك إلى موقعك، تستطيع إضافة --host=0.0.0.0 إلى أمر تشغيل الخادوم كما يلي:

flask run --host=0.0.0.0

بعد تشغيل الخادوم ستتمكّن من الوصول إلى الموجّهات الثلاثة التّي سبق وأن عرّفناها.

127.0.0.1:5000/
127.0.0.1:5000/posts
127.0.0.1:5000/users

وستُلاحظ النّتائج:

Project Index

Posts Index

Users Index

خاتمة

تعرّفنا في الدّرس على كيفيّة إنشاء مُخطّطات وتسجيلها لمرونة أكثر في التّطوير ولإدارة أفضل للتّطبيقات الكبيرة، وتعرّفنا كذلك على كيفيّة تشغيله وكيفيّة إضافة مُوجّه لكل مُخطّط، في الدّرس القادم سنتعرّف على كيفيّة التّعامل مع قوالب HTML وكيفيّة الرّبط بين مُختلف موجّهات التّطبيق.





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن