بيئة العمل

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

استخدم برمجية virtualenv لإدارة بيئتك

برمجية virtualenv هي أداة تُستخدَم لعزل تطبيقاتك في ما يسمى بالبيئة الافتراضيّة (virtual environement). البيئة الافتراضيّة هي الدليل الذي يحوي البرمجيات التي يعتمد عليها تطبيقك (الاعتماديات). كما تقوم البيئة الافتراضية أيضاً بتغيير بعض متغيّرات البيئة خاصتك للحفاظ على بيئتك التطويريّة مُحتواة (تحت السيطرة). فبدلاً من تنزيل الحزم أمثال فلاسك في دلائل الحزم الموجودة في فضاء النظام - أو فضاء المستخدم - يمكننا تنزيلهم في دليل معزول مُستخدم من التطبيق الحالي فقط. هذا يجعل من السهل تحديد أي إصدار بايثون ليتم إستخدامه وتحديد الاعتماديات التي نريدها لكل مشروع.

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

عندما تستخدم هذه البرمجية، سيصبح لديك فقط بضعة حزم بايثون مثبتة على النظام ككل. إحدى هذه الحزم ستكون أداة virtualenv ذاتها. يمكنك تثبيت حزمة virtualenv باستخدام pip.

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

$ virtualenv venv
New python executable in venv/bin/python
Installing Setuptools...........[...].....done.
Installing Pip..................[...].....done.
$

سيقوم هذا الأمر بإنشاء دليل جديد حيث يمكنك تثبيت اعتماديات مشروعك.

ينبغي عليك تفعيل البيئة الافتراضيّة بعد إنشائها عن طريق استدعاء البرمجيّة bin/activate التي تم إنشأها داخل البيئة الافتراضية.

$ which python
/usr/local/bin/python
$ source venv/bin/activate
(venv)$ which python
/Users/robert/Code/myapp/venv/bin/python

تقوم البرمجية bin/activate بإجراء بعض التغييرات على متغيّرات الصدفة (shell) خاصتك؛ ليشير كل شيء (الخدمات والبرمجيات) إلى البيئة الافتراضية الحالية بدلاً من النظام. بعد تفعيل البيئة، سيشير الأمر python إلى مُفسِر البايثون الموجود داخل البيئة الافتراضية، كما والاعتماديات المثبتة باستخدام pip سيتم تنزيلها في البيئة الافتراضية بدلاً من النظام.

قد تلاحظ أيضاً أن مُحث الصدفة (shell prompt) قد تغيّر؛ وهذا لأنّ برمجية virtualenv تقوم بإضافة اسم البيئة الافتراضية المُفعلة إليه حتى تتمكن من معرفة أنّك لا تعمل على صدفة النظام.

يمكنك تعطيل البيئة الافتراضية باستخدام الأمر deactivate.

(venv)$ deactivate
$

برمجية virtualenvwrapper

تُستخدَم الحزمة virtualenvwrapper لإدارة البيئات الافتراضية المُنشأة باستخدام أداة virtualenv. لم أرغب بذكر هذه الأداة قبل رؤيتك لأساسيات virtualenv حتى تتمكن من فهم ما الذي تضيفه هذه الأداة ولمَ ينبغي عليك استخدامها.

البيئة الافتراضية التي أنشأناها في المثال السابق تضيف فوضى إلى مستودع مشروعك. فأنت لا تتعامل معها سوى عندما تقوم بتفعيلها كما لا ينبغي تتبعها بنظام التحكم بالإصدارات، وبالتالي لا داعي لوجودها في مستودع المشروع أصلاً. الحل لهذا هو استخدام أداة virtualenvwrapper. تقوم هذه الحزمة بإبقاء جميع البيئات الافتراضية في دليل واحد، والذي هو افتراضياً في virtualenvs./~.

قم باتباع الإرشادات الموجودة في التوثيق الرسمي لتثبيت الأداة.

تحذير
تأكد من تعطيل كل البيئات الافتراضية قبل تثبيت virtualenvwrapper، فأنت تريد تثبيتها في النظام وليس في بيئة افتراضيّة.

والآن قم باستخدام الأمر mkvirtualenv لإنشاء بيئة افتراضية جديدة بدلاً من استخدام virtualenv:

$ mkvirtualenv rocket
New python executable in rocket/bin/python
Installing setuptools...........[...].....done.
Installing pip..................[...].....done.
(rocket)$

سيقوم الأمر mkvirtualenv بإنشاء دليل في مجلد البيئات الافتراضية خاصتك وسيقوم بتفعيل البيئة لك. كما سابقاً، سيشير مُفسِر python والبرمجية pip إلى البيئة الافتراضية بدلاً من النظام. لتفعيل بيئة افتراضية معينة استخدم الأمر [اسم البيئة] workon. مايزال الأمر deactivate يُستخدم لتعطيل البيئة.

تتبع الاعتماديات

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

تعليمة pip freeze

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

(rocket)$ pip freeze > requirements.txt
$ workon fresh-env
(fresh-env)$ pip install -r requirements.txt
[...]
Successfully installed flask Werkzeug Jinja2 itsdangerous markupsafe
Cleaning up...
(fresh-env)$

التتبع اليدوي للاعتماديات

مع نمو مشروعك، قد تجد بعض الحزم المُدرجة بواسطة الأمر pip freeze ليست في الواقع ضروريّة لتشغيل التطبيق. حيث سيكون لديك أيضاً الحزم المُثبتة للاستخدام في عملية التطوير فقط. الأمر pip freeze لا يميّز بين الإثنين، فهو يقوم فقط بإدراج الحزم المُثبتة حالياً. كنتيجة لذلك، قد ترغب بتتبع اعتمادياتك يدوياً عند إضافتها. يمكنك فصل بين الحزم الضروريّة لتشغيل التطبيق والحزم الضروريّة لتطويره ووضعهم في ملفين منفصلين (بالاسم require_run.txt و require_dev.txt على سبيل المثال).

التحكم بالإصدارات

اختر نظام تحكم بالإصدارات واستخدمه. انصحك باستخدام جيت (Git). مما رأيته، جيت هو الخيار الأكثر شعبيّة للمشاريع الجديدة هذه الأيام. أن تكون قادراً على حذف التعليمات البرمجية دون الحاجة إلى القلق من القيام بأخطاء لا رجعة فيها شيءٌ لا يقدر بثمن. حيث ستكون قادراً على الحفاظ على مشروعك خالياً من التعليقات، لأنّه يمكنك حذف ما تريد الآن والرجوع عن التغيير إذا دعت الحاجة. إضافةً لذلك، ستملك نسخ إحتياطية لمشروعك على جيتهاب، أو Bitbucket، أو خادم Gitolite خاص بك.

ماذا يجب أن أُبقي خارج نظام التحكم بالإصدارات؟

عادةً ما أبقي ملف خارج نظام التحكم بالإصدارات لسببٍ من سببين: إما لأنّه خردة (غير ضروري)، أو لأنّه سري. ملفات pyc. ومجلدات البيئات الافتراضية - إن كنت لا تستخدم virtualenvwrapper لسببٍ ما - أمثلة على الخردة. وذلك لأنَّه لا داعي لأن يكونوا في نظام التحكم بالإصدارات؛ فمن الممكن إعادة إنشائهم باستخدام ملفات py. و requirement.txt على التوالي.

مفاتيح الواجهات البرمجية، والمفاتيح السرية للتطبيق، وبيانات اعتماد قاعدة البيانات هي أمثلة على الأسرار. لأنه لا ينبغي وجودهم في نظام التحكم بالإصدارات؛ فكَشفُهُم للعامة سيكون خرقاً أمنياً كبيراً.

ملاحظة
عندما اتخد قرارات متعلقة بالأمن، غالباً ما أفترض أن مستودعي سيصبح ظاهراً للعموم في مرحلةٍ ما. وهذا يعني الإبقاء على الأشياء السرية وعدم الافتراض أنه لن يتم العثور على ثغرة أمنية؛ ﻷنَّ مبدأ افتراض أن "من سيستطيع تخمين أنها تتمكن من فعل ذلك؟" معروف في المجال الأمني بالإبهام (obscurity) وهي سياسة سيئة للاعتماد عليها.

عند استخدام جيت، يمكنك إنشاء ملف خاص يدعى gitignore. في مستودعك. قم بسرد أنماط في هذا الملف تستخدم حروف بدل (Wildcard) لتطابق أسماء ملفات معينة. أي ملف يتطابق مع أحد تلك الأنماط سيتم تجاهله بواسطة جيت. أنصحك باستخدام ملف gitignore. الموضح أدناه للتوضح الفكرة.

*.pyc
instance/

تُستخدَم مجلدات instance لجعل متغيّرات الإعداد السرية متاحة لتطبيقك بطريقة أكثر أماناً. سنتحدث المزيد عنهم لاحقاً.

ملاحظة
يمكنك قراءة المزيد حول ملف gitignore. على http://git-scm.com/docs/gitignore

التنقيح (تصحيح الأخطاء)

وضع التنقيح

يأتي إطار فلاسك مع ميزة مفيدة تدعى "وضع التنقيح". عليك تعيين debug = True لتشغيلها في إعدادات التطوير خاصتك. عندما يكون هذا الخيار قيد العمل، يقوم الخادم بإعادة التشغيل عند إجراء تغييرات على الشيفرة البرمجية، كما وتظهر الأخطاء في رصة تتبع (stack trace) ووحدة تحكم تفاعلية (interactive console).

تحذير
انتبه من تشغيل وضع التنقيح في وضع الإنتاج؛ فتتيح وحدة التحكم التفاعلية تنفيذ تعليمات برمجية مما سيؤدي إلى هشاشة أمنية كبيرة إذا تُرِكت هذه الخاصية قيد العمل في الموقع الحي (المرفوع على الشابكة).

أداة Flask-DebugToolbar

برمجية Flask-DebugToolbar هي أداة رائعة أخرى لتنقيح المشاكل الموجودة في تطبيقك. في وضع التنقيح، ستقوم الأداة بإضافة شريط جانبي في كل صفحة في تطبيقك. هذا الشريط يوفِر معلومات حول استعلامات SQL، والتسجيل (logging)، والإصدارات، والقوالب، والإعدادات، وغيرها من الأشياء الجميلة التي ستجعل تتبع الأخطاء أسهل.

ملاحظة

الخلاصة

  • استخدم أداة virtualenv لإبقاء اعتماديات تطبيقك في مكان واحد.
  • استخدم أداة virtualenvwrapper لإبقاء بيئاتك الافتراضية في مكان واحد.
  • تتبَّع الاعتماديات باستخدام ملف نصي أو أكثر.
  • استخدم نظام تحكم بالإصدارات. أنصحك باستخدم جيت.
  • استخدم ملف gitignore. لإبقاء الفوضى والأسرار خارج نظام التحكم بالإصدارات.
  • يمنحك وضع التنقيح معلومات حول المشاكل في عملية التطوير.
  • ستمنحك إضافة Flask-DebugToolbar المزيد من المعلومات المفيدة في عملية التنقيح.

results matching ""

    No results matching ""