يهدف هذا التمرين إلى التعرف على البرمجة الأساسية للخلفية/الخادم بطريقة تفاعلية ، بالإضافة إلى أن تشعر بالراحة في التطور في بيئة Python/Flask الحديثة.
ستساعدك قراءة ما يلي في الحصول على إحساس بالصورة الكبيرة عندما يتعلق الأمر بتطوير رمز جانب خادم واجهات برمجة التطبيقات/الكتابة ، وكيف يتناسب مع سياق تطبيق ويب أكبر:
سيتم تقسيم هذا المشروع إلى أجزاء متعددة. بعد الانتهاء من هذا المشروع ، يجب عليك إرساله باتباع الإرشادات أدناه.
هذا التمرين مستحق قبل يوم الاثنين ، 17 سبتمبر ، الساعة 11:59 مساءً. إذا كنت قد قضيت أكثر من 10 ساعات بما في ذلك عملك مع React-Bexercise ، فأرسل ما لديك!
لأي أسئلة ، لا تتردد في إرسال بريد إلكتروني إلى [email protected].
تعليمات التثبيت لنظام التشغيل Mac و Windows.
مورد رائع آخر لأي شيء على Python ، بما في ذلك التثبيت هو دليل Hitchhiker إلى Python.
تحقق مما إذا كان لديك الإصدارات الصحيحة عن طريق تشغيل الأوامر التالية في المحطة الخاصة بك:
python3 -V
pip3 -V
pipenv --version
أولا ، شوكة هذا المستودع. زر الشوكة في الجزء العلوي الأيمن الخاص بك. ما يفعله هذا هو نسخ هذا المستودع إلى حسابك. الآن يجب أن يكون لديك مستودع يحمل اسم <yourusername>/flask-exercise .
يجب أن يبدو هكذا (اسم المستخدم الخاص بي هو TKO22): 
بعد ذلك ، استنساخ هذا المستودع (انقر فوق الزر الأخضر قائلاً "استنساخ أو تنزيل" ، واختر HTTP ، ونسخه ولصقه في الموقع <url> ) وانتقل إليه:
$ git clone <url>
$ cd flask-exercise
بعد ذلك ، قم بإعداد بيئتك الافتراضية وتثبيت تبعيات Python المطلوبة لتشغيل هذا التطبيق. نستخدم PipenV ، الذي يقوم تلقائيًا بإعداد كل شيء ، بالنظر إلى pipfile و pipfile.lock. يستخدم Pipfile VirtualEnv ، وهي بيئة بيثون افتراضية معزولة عن مشاريع بيثون الأخرى ، غير قادرة على التدخل في برامج بيثون الأخرى أو تتأثر بها على نفس الجهاز. أنت بالتالي قادر على تشغيل إصدارات مختلفة من نفس الحزمة أو حتى إصدارات Python مختلفة.
pipenv install --skip-lock
يجب أن تكون في هذه البيئة الافتراضية لبدء هذا الخادم. للقيام بذلك:
pipenv shell
ثم ، لبدء تشغيل الخادم:
(backend-exercise-o4dc6oDL)$ python app.py
ملاحظة: ستبقى هذه عملية تشغيل في المحطة الخاصة بك ، لذلك ستحتاج إلى فتح علامة تبويب أو نافذة جديدة لتنفيذ أوامر أخرى.
لوقف الخادم ، اضغط على Control-C .
للخروج من بيئتك الافتراضية ، التي تم تسميتها backend-exercise-[something here] ، تشغيل:
(backend-exercise-o4dc6oDL)$ deactivate
يمكنك أيضًا إضافة pipenv run قبل أي أمر بدلاً من الاضطرار إلى تشغيل pipenv shell . مثل pipenv run python app.py
قبل إجراء أي تغييرات على الكود ، تأكد من إنشاء فرع جديد. عادةً ما يتم تسمية الفروع بناءً على الميزة أو معالجة Bugfix ، ولكن بالنسبة لهذا المشروع ، قم بتسمية فرعك باسمك حتى يتمكن المراجع بسهولة من اتباعه:
git checkout -b <YOUR_NAME>
يجب أن تكون أسماء الفروع صغيرة ولا يمكن أن تحتوي على مساحات. بدلا من المسافات ، استخدم الواصلات. على سبيل المثال:
git checkout -b varun-munjeti
سيجعل بدء تشغيل الخادم عملية تشغيل مستمرة على localhost:5000 . من أجل تقديم طلبات إلى الخادم الخاص بك ، استخدم Postman.
أولاً ، قدم طلب GET على / النهاية. نظرًا لأن الخادم يعمل على localhost:5000 ، فإن عنوان URL الكامل للنقطة هو localhost:5000/ .

حاول استدعاء نقطة النهاية /mirror . أولاً ، انظر إلى الكود لنقطة النهاية لمعرفة كيف يمكنك تحديد معلمات URL. ثم قدم طلبًا على ساعي البريد إلى localhost:5000/mirror/<name> :

هذه التمارين سوف تمشيك من خلال إنشاء واجهة برمجة تطبيقات مريحة باستخدام قارورة! لا نريد منك أن تمر بكل متاعب إعداد مثيل قاعدة البيانات ، لذلك قمنا بإنشاء بيانات وهمية وواجهة قاعدة بيانات وهمية للتفاعل معها. من أجل السهولة ، سيتم تطبيق منطق التطبيق بالكامل ناقصًا لمنطق MockDB عن طريق تطبيقه في app.py بالنسبة للمشاريع الكبيرة ، سيتم عادةً فصل نقاط نهاية API إلى ملفات مختلفة تسمى views .
قبل أن تبدأ ، ألقِ نظرة جيدة على وظيفة create_response وكيفية عملها. تأكد من اتباع الإرشادات الخاصة بكيفية استخدام هذه الوظيفة ، وإلا فلن تتبع واجهة برمجة التطبيقات الخاصة بك الاتفاقيات المناسبة!
ألق نظرة على قاعدة بيانات وهمية. يتم تعريف البيانات الوهمية الأولية في mockdb/dummy_data.py . هذا هو ما سيكون "موجودًا" في "قاعدة البيانات" عند بدء تشغيل الخادم.
الوظائف المحددة في mockdb/mockdb_interface.py هي كيف يمكنك الاستعلام عن mockdb. في app.py ، حيث ستكتب واجهة برمجة التطبيقات الخاصة بك ، تم استيراد هذا باسم db . لذلك عندما تكتب الرمز لنقاط النهاية الخاصة بك ، يمكنك الاتصال بوظائف واجهة DB مثل db.get('users') .
عندما تقوم بتعديل الرمز الخاص بك ، سيتم تحديث الخادم تلقائيًا ، ما لم يتم تجميع الرمز الخاص بك ، وفي هذه الحالة سيتوقف الخادم عن التشغيل ويجب عليك إعادة تشغيله يدويًا بعد إصلاح الرمز الخاص بك.
حدد نقطة النهاية:
GET /users
يجب أن يعيد هذا استجابة JSON المنسقة بشكل صحيح تحتوي على قائمة بجميع user في mockdb. إذا اتصلت بنقطة النهاية هذه مباشرة بعد بدء الخادم ، فيجب عليك الحصول على هذا الرد في ساعي البريد:
{
"code": 200,
"message": "",
"result": {
"users": [
{
"age": 19,
"id": 1,
"name": "Aria",
"team": "LWB"
},
{
"age": 20,
"id": 2,
"name": "Tim",
"team": "LWB"
},
{
"age": 23,
"id": 3,
"name": "Varun",
"team": "NNB"
},
{
"age": 24,
"id": 4,
"name": "Alex",
"team": "C2TC"
}
]
},
"success": true
}
حدد نقطة النهاية:
GET /users/<id>
يجب أن يسترجع هذا مستخدمًا واحدًا يحتوي على id المقدم من الطلب.
إذا لم يكن هناك مستخدم مع id المقدم ، فقم بإرجاع 404 message وصفية.
قم بتوسيع أول /users عن طريق إضافة القدرة على الاستعلام عن المستخدمين بناءً على الفريق الذي يقومون به. يجب ألا تستخدم معلمة عنوان URL كما فعلت في الجزء 2. بدلاً من ذلك ، استخدم سلسلة استعلام.
إذا تم توفير team كمعلمة لسلسلة الاستعلام ، فأرجع المستخدمين الموجودين في هذا الفريق فقط. إذا لم يكن هناك مستخدمون في team المقدم ، فقم بإرجاع قائمة فارغة.
لهذا التمرين ، يمكنك تجاهل أي معلمات سلسلة استعلام غير team .
في Postman ، يمكنك توفير معلمات سلسلة الاستعلام كتابة سلسلة الاستعلام في عنوان URL طلبك أو عن طريق الضغط على زر Params بجوار Send . سيؤدي القيام بذلك تلقائيًا إلى ملء عنوان URL للطلب.
يجب أن يحدث ما يلي
GET /users?team=LWB
{
"code": 200,
"message": "",
"result": {
"users": [{
"age": 19,
"id": 1,
"name": "Aria",
"team": "LWB"
}, {
"age": 20,
"id": 2,
"name": "Tim",
"team": "LWB"
}]
},
"success": true
}

حدد نقطة النهاية:
POST /users
يجب أن تنشئ نقطة النهاية هذه مستخدمًا جديدًا. يجب أن يرسل كل طلب أيضًا name age ومعلمة team في body الطلب. سيتم إنشاء خاصية id تلقائيًا في MockDB.
يجب أن يقوم الطلب الناجح بإرجاع رمز الحالة لعام 201 وإرجاع المستخدم الذي تم إنشاؤه حديثًا.
إذا لم يتم توفير أي من المعلمات الثلاثة المطلوبة ، فلا تقم بإنشاء مستخدم جديد في DB وإرجاع 422 message مفيدة. بشكل عام ، يجب أن توفر رسائلك للمستخدم/المطور ملاحظات مفيدة حول ما فعلوه خطأ وكيف يمكنهم إصلاحه.
هذه هي الطريقة التي يمكنك بها إرسال معلمات body من ساعي البريد. تأكد من أنك لا تخطئ في هذا لمعلمات الاستعلام! 
حدد نقطة النهاية:
PUT /users/<id>
نحتاج هنا إلى توفير id المستخدم لأننا بحاجة إلى تحديد المستخدم الذي يجب تحديثه. يجب أن يحتوي body لهذا الطلب على نفس سمات طلب POST من الجزء 4.
ومع ذلك ، فإن الفرق في طلب PUT هذا هو أن القيم فقط مع المفاتيح المقدمة ( name age team ) سيتم تحديثها ، وأي معلمات لم يتم توفيرها لن تغير السمة المقابلة في المستخدم الذي يتم تحديثه.
لا تحتاج إلى حساب معلمات body التي لا تشرف عليها name أو age أو team .
إذا لم يكن من الممكن العثور على id المقدم ، فأرجع 404 message مفيدة.
حدد نقطة النهاية:
DELETE /users/<id>
سيؤدي هذا إلى حذف المستخدم id المرتبط به. إرجاع message مفيدة ، على الرغم من أنه لا يوجد شيء يجب تحديده في result الاستجابة.
إذا لم يكن من الممكن العثور على id المقدم ، فأرجع 404 message مفيدة.
لنكتب اختبارات الوحدة! اختبارات الوحدة مهمة للغاية لتطوير البرمجيات. إنه يمكّن من التحقق تلقائيًا ما إذا كانت وظيفتنا تعمل أم لا لأن اختبار كل شيء يدويًا بطيئ للغاية ومعرض للخطأ. التطوير المدعوم من الاختبار هو عملية تطوير البرمجيات التي نحدد فيها المواصفات ، وكتابة اختبارات لتلك المواصفات ، ثم تنفيذ الوظيفة ، واستخدم الاختبارات للتحقق مما إذا كانت تعمل. لقد فعلنا القليل من ذلك بالنسبة لك حيث يتم كتابة اختبارات الجزء 1-3. لاختبارهم:
pipenv install --dev
pipenv run pytest
إذا نجحت التغييرات الخاصة بك ، فيجب أن ترى خطًا أخضر يقول 5 passed . إذا لم يفعلوا ذلك ، اتبع آثار المكدس وإصلاح تنفيذك. بمجرد عملهم ، دعنا نكتب اختبارات للأجزاء 3-6 .
نحن نستخدم Pytest ، وهو إطار اختبار Python مفيد يجد وتشغيل طرق Python تلقائيًا التي تبدأ test ، مثل test_get_index . في حالتنا ، لدينا ملف اختبار يسمى test_app.py ، والذي يحتوي على جميع اختبارات الأجزاء 1-3.
تقبل كل طريقة أيضًا كائن client ، يتم حقنه تلقائيًا بواسطة PYTest. client هو اختبار اختبار ، وهو شيء قد تستخدمه في اختبارات متعددة ، مما يمنحك خطًا أساسيًا ثابتًا لاختباراتك. عند التهيئة ، يبحث Pytest إلى conftest.py ويجمع جميع التركيبات. في حالتنا ، لدينا لاعبا اساسيا client ، والذي يعطي عميل اختبار قارورة ، يمكننا استخدامه لاختبار واجهة برمجة التطبيقات الخاصة بنا بسهولة. انظر إلى كيفية استخدام عميل اختبار Flask لإنشاء أنواع أخرى من الطلبات وكيف يمكنك استخدام حمولة الطلب.
عندما تنتهي من جميع الخطوات ، ادفع التغييرات الخاصة بك إلى repo github!
دعنا نركض الأسود ، بيثون فورث ، قبل التقديم. هذا يزيل جميع الحجج حول كيف نريد تصميم رمز Python الخاص بك ويمنح المراجعين نمطًا موحدًا للمراجعة من. يجب أن يكون مثبتًا مع pipenv install --dev
pipenv run black .
قبل أن تتمكن من إرسال العلاقات العامة ، سيتعين عليك دفع فرعك إلى فرع بعيد (واحد على Github ، وليس محليًا).
تحقق لترى أنك في فرعك:
git branch
إذا كنت ترغب في التأكد من أن جميع الاهتمامات الخاصة بك في:
git log
اضغط على Q لإنهاء شاشة git log .
ادفع ارتباطاتك إلى فرعك البعيد:
git push
في المرة الأولى التي تقوم فيها بذلك ، قد تحصل على خطأ لأن فرعك البعيد غير موجود بعد. عادة ما يخبرك بالأمر الصحيح لاستخدامه:
git push --set-upstream origin <YOUR_BRANCH_NAME>
ملاحظة: يجب القيام بذلك فقط في المرة الأولى التي تدفع فيها فرعًا جديدًا. يمكنك استخدام git push فقط بعد ذلك.
بمجرد الانتهاء من ذلك ، يرجى إرسال بريد إلكتروني إلى [email protected] مع الرابط لمستودعك المتشعب واسم فرعك. سنحتاج إلى هذين الأمرين لعرض تقديمك.