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