1. نظرة عامة
تهدف سلسلة الدروس التطبيقية حول الترميز هذه (البرامج التعليمية العملية التي تناسب وتيرة المتعلّم) إلى مساعدة مطوّري Google App Engine (الإصدار العادي) في تحديث تطبيقاتهم من خلال إرشادهم خلال سلسلة من عمليات نقل البيانات. أهم خطوة هي التوقّف عن استخدام الخدمات المجمّعة مع وقت التشغيل الأصلي، لأنّ أوقات التشغيل من الجيل التالي أكثر مرونة، ما يمنح المستخدمين مجموعة أكبر من خيارات الخدمة. يتيح لك الانتقال إلى وقت التشغيل من الجيل الأحدث إمكانية الدمج مع منتجات Google Cloud بسهولة أكبر، واستخدام مجموعة أوسع من الخدمات المتوافقة، والاستفادة من إصدارات اللغات الحالية.
يعرض هذا البرنامج التعليمي الأوّلي خطوات النقل الأولى لتحديث إطار عمل الويب في تطبيقات App Engine: الانتقال من webapp2 إلى Flask. في تطبيقك، يمكنك استخدام أي إطار عمل للويب يتعامل مع التوجيه، ولكن في هذا البرنامج التعليمي، سنستخدم Flask لأنّه مستخدَم على نطاق واسع من قِبل المنتدى.
ستتعرّف على كيفية
- استخدام مكتبات تابعة لجهات خارجية (مضمّنة أو غير ذلك)
- تعديل ملفات الإعداد
- نقل تطبيق بسيط من
webapp2إلى Flask
المتطلبات
- مشروع Google Cloud Platform يتضمّن ما يلي:
- مهارات أساسية في لغة Python
- معرفة عملية بأوامر Linux الأساسية
- معرفة أساسية بشأن تطوير ونشر تطبيقات App Engine
استطلاع الرأي
كيف ستستخدم هذا الدرس التطبيقي حول الترميز؟
2. الخلفية
تم تجميع إطار عمل webapp عند إطلاق App Engine لأول مرة على الإصدار 2.5 من Python في عام 2008. بعد سنوات، تم استبداله بالإصدار الأحدث webapp2 عندما تم إيقاف وقت التشغيل 2.7 نهائيًا في الإصدار 2.5 في عام 2013.
على الرغم من أنّ webapp2 (راجِع المستندات) لا يزال متاحًا ويمكن استخدامه خارج App Engine كإطار عمل متوافق مع WSGI، إلا أنّه لا يوجّه طلبات المستخدمين إلى الرمز المناسب في التطبيق. بدلاً من ذلك، يعتمد على App Engine وملفات الإعداد والمطوّر لتنفيذ توجيه زيارات الويب إلى "المعالِجات" المناسبة. بالإضافة إلى ذلك، ترتبط المزايا الأساسية لـ webapp2 ارتباطًا وثيقًا بالخدمات المجمّعة في App Engine، ما يؤدي إلى إيقافها نهائيًا على الرغم من أنّها تعمل على Python 3 (يمكنك أيضًا الاطّلاع على المشكلة ذات الصلة).
تمنح هذه الوحدة المتدرّبين تجربة عملية لنقل تطبيق بسيط webapp2 إلى Flask، وهو إطار عمل متوافق مع App Engine والعديد من الخدمات الأخرى خارج Google Cloud، ما يجعل التطبيقات أكثر قابلية للنقل. إذا لم يكن Flask هو إطار العمل المطلوب لنقل تطبيقك إليه، يمكنك اختيار إطار عمل آخر طالما أنّه يوفّر توجيهًا خاصًا به. يوضّح هذا الدرس التطبيقي لصنّاع القرار في مجال تكنولوجيا المعلومات والمطوّرين خطوات نقل البيانات، ما يتيح لك التعرّف على هذه العملية بغض النظر عن إطار العمل الذي ستنقل البيانات إليه.
في ما يلي الخطوات الأساسية لعملية نقل البيانات هذه:
- الإعداد/العمل التحضيري
- إضافة مكتبة Flask تابعة لجهة خارجية
- تعديل ملفات التطبيق
- تعديل ملف نموذج HTML
3- الإعداد/العمل التحضيري
قبل البدء في الجزء الرئيسي من البرنامج التعليمي، لنقم بإعداد مشروعنا والحصول على الرمز، ثم نعيد تعريفك على الأمر gcloud وننشر التطبيق الأساسي حتى نعرف أنّنا بدأنا برمز برمجي يعمل.
1. إعداد المشروع
بصفتك مطوِّرًا حاليًا، من المحتمل أنّ لوحة بيانات App Engine تعرض الخدمات التي تستخدمها حاليًا. لأغراض هذا البرنامج التعليمي، ننصحك بإنشاء مشروع جديد تمامًا أو إعادة استخدام مشروع حالي لهذا البرنامج التعليمي. تأكَّد من أنّ المشروع يتضمّن حساب فوترة نشطًا وأنّ خدمة App Engine (التطبيق) مفعَّلة.
2. تنزيل نموذج تطبيق البيانات الأساسية
يتضمّن مستودع نقل البيانات في GAE كل الرموز التي تحتاج إليها. يمكنك استنساخه أو تنزيل ملف ZIP الخاص به. في هذا البرنامج التعليمي، ستبدأ بالرمز البرمجي في المجلد "الوحدة 0" (START)، وعند الانتهاء من البرنامج التعليمي، يجب أن يتطابق الرمز البرمجي مع المجلد "الوحدة 1" (FINISH). إذا لم يكن كذلك، اطّلِع على الاختلافات لتتمكّن من الانتقال إلى التجربة التالية.
- البداية: رمز الوحدة 0
- إنهاء: رمز الوحدة 1
- المستودع بأكمله (لنسخه أو تنزيل ملف ZIP)
يجب أن يحتوي المجلد "الوحدة 0" على ملفات تبدو على النحو التالي، كما هو موضّح باستخدام الأمر POSIX ls:
$ ls
app.yaml index.html main.py
3- (إعادة) التعرّف على أوامر gcloud
إذا لم يكن لديك الأمر gcloud على جهازك بعد، ثبِّت حزمة تطوير البرامج (SDK) من Google Cloud وتأكَّد من توفُّر gcloud كجزء من مسار التنفيذ، وتعرَّف على أوامر gcloud التالية:
gcloud components update— تعديل Google Cloud SDKgcloud auth login: سجِّل الدخول إلى حسابك الذي تم التحقّق منهgcloud config list— إدراج إعدادات ضبط مشروع Google Cloud Platformgcloud config set project PROJECT_ID: ضبط رقم تعريف مشروع GCPgcloud app deploy: نشر تطبيق App Engine
إذا لم يسبق لك تطوير تطبيقات باستخدام App Engine مع gcloud مؤخرًا، عليك تنفيذ الأوامر الأربعة الأولى (من 1 إلى 4) لإعداد البيئة قبل الانتقال إلى الخطوات التالية. لنلقِ نظرة سريعة على هذه الأوامر.
أولاً، يضمن لك الأمر gcloud components update توفُّر أحدث إصدار من Cloud SDK. من المفترض أن يؤدي تنفيذ هذا الأمر إلى عرض نتيجة مشابهة لما يلي:
$ gcloud components update
Your current Cloud SDK version is: 317.0.0
You will be upgraded to version: 318.0.0
┌──────────────────────────────────────────────────┐
│ These components will be updated. │
├──────────────────────────┬────────────┬──────────┤
│ Name │ Version │ Size │
├──────────────────────────┼────────────┼──────────┤
│ Cloud SDK Core Libraries │ 2020.11.06 │ 15.5 MiB │
│ gcloud cli dependencies │ 2020.11.06 │ 10.6 MiB │
└──────────────────────────┴────────────┴──────────┘
The following release notes are new in this upgrade.
Please read carefully for information about new features, breaking changes,
and bugs fixed. The latest full release notes can be viewed at:
https://cloud.google.com/sdk/release_notes
318.0.0 (2020-11-10)
. . .
(release notes)
. . .
Subscribe to these release notes at
https://groups.google.com/forum/#!forum/google-cloud-sdk-announce.
Do you want to continue (Y/n)?
╔════════════════════════════════════════════════════════════╗
╠═ Creating update staging area ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Uninstalling: Cloud SDK Core Libraries ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Uninstalling: gcloud cli dependencies ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Cloud SDK Core Libraries ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: gcloud cli dependencies ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Creating backup and activating new installation ═╣
╚════════════════════════════════════════════════════════════╝
Performing post processing steps...done.
Update done!
To revert your SDK to the previously installed version, you may run:
$ gcloud components update --version 317.0.0
بعد ذلك، استخدِم gcloud auth login للمصادقة على نفسك من أجل أوامر gcloud التي ستصدرها من الآن فصاعدًا:
$ gcloud auth login
Your browser has been opened to visit:
https://accounts.google.com/o/oauth2/auth?response_type=code&client_id= . . .
You are now logged in as [YOUR_EMAIL].
Your current project is [PROJECT_ID]. You can change this setting by running:
$ gcloud config set project PROJECT_ID
استخدِم gcloud config list لمعرفة إعدادات مشروعك الحالية:
$ gcloud config list [core] account = YOUR_EMAIL disable_usage_reporting = False project = PROJECT_ID Your active configuration is: [default]
يجب أن يرشدك الأمر أعلاه إلى إنشاء مشروع جديد أو اختيار مشروع حالي. إذا لم تتطابق نتيجة gcloud config list مع المشروع المحدّد الذي تريد استخدامه في هذا البرنامج التعليمي، شغِّل gcloud config set project PROJECT_ID لضبط رقم تعريف المشروع. بعد ذلك، تأكَّد من ضبط رقم تعريف المشروع الصحيح عن طريق تنفيذ gcloud config list مرة أخرى.
$ gcloud config set project PROJECT_ID Updated property [core/project].
إذا كنت تفضّل استخدام Cloud Console بدلاً من ذلك، يمكنك اتّباع واجهة المستخدم لإنشاء مشروع جديد إذا أردت ذلك أو استخدام أي مشروع حالي لديك. في لوحة بيانات مشروعك، يجب أن تظهر بطاقة معلومات المشروع التي تعرض رقم تعريفه (بالإضافة إلى اسم المشروع ورقمه):

الأمر الأخير (رقم 5)، gcloud app deploy، هو لنشر تطبيقك على App Engine. بما أنّنا في المراحل الأولى، فإنّ تنفيذها الآن اختياري، ولكننا بالتأكيد لا ننصح بعدم نشر رمز الوحدة 0 للتأكّد من أنّه يعمل. عند التنفيذ، اختَر المنطقة الجغرافية التي تريد تشغيل التطبيق فيها (عادةً ما تكون المنطقة التي تقيم فيها). ولا يمكن تغيير هذا الإعداد بعد ضبطه. بعد ذلك، شاهِد بقية معلومات النشر. عند اكتمال العملية، سيتم إعلامك بعنوان URL الذي سيتم عرض تطبيقك عليه. في ما يلي نسخة مختصرة من المعلومات التي قد تظهر لك:
$ gcloud app deploy Services to deploy: descriptor: [/private/tmp/mod0-baseline/app.yaml] source: [/private/tmp/mod0-baseline] target project: [PROJECT_ID] target service: [default] target version: [20201116t220827] target url: [https://PROJECT_ID.REG_ABBR.r.appspot.com] Do you want to continue (Y/n)? Beginning deployment of service [default]... ╔════════════════════════════════════════════════════════════╗ ╠═ Uploading 1 file to Google Cloud Storage ═╣ ╚════════════════════════════════════════════════════════════╝ File upload done. Updating service [default]...done. Setting traffic split for service [default]...done. Deployed service [default] to [https://PROJECT_ID.REG_ABBR.r.appspot.com] You can stream logs from the command line by running: $ gcloud app logs tail -s default To view your application in the web browser run: $ gcloud app browse
إذا لم تستخدم App Engine لفترة من الوقت، قد تلاحظ أنّه تم استبدال أمر النشر الأصلي appcfg.py update بالأمر gcloud app deploy. لمزيد من المعلومات حول gcloud app deploy، يمكنك الاطّلاع على صفحة المستندات الخاصة به.
من التغييرات الأخيرة أيضًا عنوان URL للتطبيقات التي تم نشرها، والذي تم تعديله من http://PROJECT_ID.appspot.com إلى http://PROJECT_ID.REG_ABBR.r.appspot.com. سيتم تحويل معظم التطبيقات في النهاية إلى التنسيق الجديد. يمكنك الاطّلاع على مزيد من المعلومات حول تنسيق عنوان URL في مستندات الطلبات والتوجيه.
بعد نشر التطبيق، أعِد تحميل المتصفّح (ربما عدة مرات) للاطّلاع على أحدث الزيارات:

إذا كان تطبيقك جديدًا، لن تظهر لك سوى زيارة واحدة أو بضع زيارات.
4. إضافة مكتبة Flask تابعة لجهة خارجية
توفّر بيئة وقت تشغيل Python 2 في App Engine مجموعة من مكتبات الجهات الخارجية"المضمّنة"، وكل ما عليك فعله هو تحديدها في ملف app.yaml لاستخدامها. على الرغم من أنّ عملية نقل البيانات هذه لا تتطلّب استخدامها، سيتم تضمينها في البرنامج التعليمي التالي لعملية نقل البيانات (للوحدة 2).
يجب تحديد مكتبات الجهات الخارجية التي لم يتم تضمينها في ملف باسم requirements.txt وتثبيتها محليًا في المجلد lib في الدليل نفسه الذي يتضمّن الرمز البرمجي للتطبيق الذي يتم تحميل كل شيء منه إلى App Engine. يمكنك الاطّلاع على مزيد من المعلومات في مستندات تجميع المكتبات التابعة لجهات خارجية.
تتطلّب المكتبات المنسوخة، مثل Flask، أن تطلب من App Engine البحث عنها في المجلد lib باستخدام ملف الإعداد appengine_config.py. يتم وضع ملف الإعداد appengine_config.py في مجلد التطبيق نفسه ذي المستوى الأعلى مثل requirements.txt وlib. في هذا الجزء من البرنامج التعليمي، سنتعرّف على ما يلي:
- إنشاء
requirements.txt(تحديد المكتبات المنسوخة [غير المضمّنة] التابعة لجهات خارجية) - إنشاء
appengine_config.py(التعرّف على المكتبات التابعة لجهات خارجية) - تثبيت الحِزم والموارد التابعة (التابعة لجهات خارجية)
1. إنشاء requirements.txt
أنشِئ ملف requirements.txt لتحديد حِزمك. في حالتنا، Flask هي مكتبة تابعة لجهة خارجية مطلوبة. في وقت كتابة هذا المقال، كان أحدث إصدار هو 1.1.2، لذا أنشئ requirements.txt باستخدام هذا السطر الواحد:
Flask==1.1.2
يمكنك الرجوع إلى مستندات requirements.txt لمعرفة المزيد عن التنسيقات المقبولة.
2. إنشاء appengine_config.py
الخطوة التالية هي أن يتعرّف App Engine على المكتبات الخارجية التابعة لجهات خارجية. أنشئ ملفًا باسم appengine_config.py يتضمّن المحتوى التالي:
from google.appengine.ext import vendor
# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
تنفّذ هذه الرمز البرمجي ما حدّدناه سابقًا بالضبط، أي توجّه App Engine إلى المجلد lib للمكتبات المنسوخة.
3- تثبيت الحِزم والموارد التابعة
الآن، شغِّل الأمر pip install لإنشاء المجلد lib وتثبيت Flask والملفات التابعة له فيه:
$ pip install -t lib -r requirements.txt
سواء استخدمت pip أو pip2، بعد اكتمال عملية تثبيت الحزمة، من المفترض أن يكون لديك مجلد lib يتضمّن محتوى مشابهًا لما يلي:
$ ls lib bin/ click/ click-7.1.2.dist-info/ flask/ Flask-1.1.2.dist-info/ itsdangerous/ itsdangerous-1.1.0.dist-info/ jinja2/ Jinja2-2.11.2.dist-info/ markupsafe/ MarkupSafe-1.1.1.dist-info/ werkzeug/ Werkzeug-1.0.1.dist-info/
5- تعديل ملفات التطبيق
لنحدّث الآن ملف التطبيق، main.py.
1. عمليات الاستيراد
تأتي عمليات الاستيراد أولاً كما هو الحال في جميع ملفات Python. يتبع استيراد إطار عمل webapp2 مكتبة ndb Datastore، وأخيرًا إضافة App Engine التي تعالج النماذج المتوافقة مع Django. من المفترض أن يظهر لك ما يلي:
- قبل:
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.webapp import template
عند الانتقال إلى Flask، يمكنك استيراد كل من Flask وأجزاء عارض النماذج في الوقت نفسه. احذف عملية الاستيراد المرتبطة بـ webapp2 واستبدلها بما يلي (اترك عملية الاستيراد ndb كما هي):
- AFTER:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
2. التشغيل
تتطلّب التطبيقات التي تستخدم webapp2 مصفوفة واحدة (قائمة Python) تسرد جميع المسارات ومعالجاتها في أي ملف Python (قد تكون هناك ملفات أخرى):
- قبل:
app = webapp2.WSGIApplication([
('/', MainHandler),
], debug=True)
يُرجى العِلم أنّ app.yaml تنفّذ توجيهًا على مستوى أعلى وقد تستدعي معالِجات مختلفة. التطبيق النموذجي بسيط بما يكفي بحيث تصل جميع المسارات إلى معالج main.py.
لا يستخدم Flask جداول التوجيه على هذا النحو، لذا احذف هذه الأسطر في main.py. يتطلّب Flask أيضًا عملية تهيئة، لذا أضِف السطر التالي في أعلى الملف main.py أسفل عمليات الاستيراد مباشرةً:
- AFTER:
app = Flask(__name__)
في Flask، عليك أولاً تهيئة إطار العمل ثم استخدام أدوات التزيين لتحديد المسارات. بالإضافة إلى ذلك، يتم إقران المسارات بالدوال وليس بالفئات أو الطرق.
لا يهدف هذا الدرس التطبيقي حول الترميز إلى تضمين دليل توجيهي/تعليمي حول Flask، لذا ننصحك بتخصيص بعض الوقت لإكمال الدليل التوجيهي/التعليمي حول Flask ومراجعة مستندات Flask للتعرّف أكثر على هذا الإطار.
3- نموذج البيانات
ما مِن تغييرات هنا. سيكون Datastore محور الدرس العملي التالي.
4. المعالجات
ينفّذ التطبيق، بغض النظر عن إطار العمل الذي تستخدمه (webapp2 أو Flask)، 3 مهام:
- التعامل مع طلبات GET لمسار الجذر (
/) - تسجيل "زيارة" لصفحة ويب (إنشاء/تخزين العنصر
Visit) - عرض آخر 10 زيارات (باستخدام نموذج محدّد مسبقًا،
index.html)
يستخدم إطار عمل webapp2 نموذج تنفيذ مستند إلى الفئات يتم فيه إنشاء معالِجات لكل طريقة HTTP متوافقة. في حالتنا البسيطة، لدينا GET فقط، لذا يتم تحديد طريقة get():
- قبل:
class MainHandler(webapp2.RequestHandler):
def get(self):
store_visit(self.request.remote_addr, self.request.user_agent)
visits = fetch_visits(10) or () # empty sequence if None
tmpl = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(tmpl, {'visits': visits}))
كما ذكرنا أعلاه، تنفّذ Flask عملية التوجيه الخاصة بها. بدلاً من فئة معالجة، يمكنك كتابة دوال وتزيينها بالمسار الذي يجب استدعاؤها من أجله. يمكن للمستخدمين تحديد طرق HTTP التي يتم التعامل معها في استدعاء أداة التزيين، أي @app.route('/app/', methods=['GET', 'POST']). بما أنّ القيمة التلقائية هي GET فقط (وHEAD ضمنيًا)، يمكن تركها غير مفعّلة.
عند الانتقال إلى Flask، استبدِل الفئة MainHandler وطريقتها get() بدالة توجيه Flask التالية:
- AFTER:
@app.route('/')
def root():
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10) or () # empty sequence if None
return render_template('index.html', visits=visits)
بالطبع، هذا لا يمثّل تطبيقك الذي سيكون بالتأكيد أكثر تعقيدًا من هذا المثال. أحد الأهداف الأساسية لهذه البرامج التعليمية هو مساعدتك في البدء، وبناء بعض "الذاكرة العضلية"، وفهم الأماكن التي يجب إجراء تغييرات فيها في الرمز البرمجي الخاص بـ App Engine. للتأكّد من إجراء هذا التغيير بشكلٍ صحيح، قارِن التغيير الذي أجريته بالوحدة 1 main.py.
5- الملفات المساعدة
لم يتم إجراء أي تغييرات على ملف .gcloudignore. الغرض منه هو تحديد الملفات التي لا يتم نشرها على App Engine والتي لا تكون ضرورية لنشر التطبيق وتنفيذه، بما في ذلك على سبيل المثال لا الحصر، ملفات Python المساعدة، والتحكّم في المصدر، والرمز النموذجي للمستودع، والملفات الأخرى. يبدو .gcloudignore على النحو التالي (تمت إزالة التعليقات للإيجاز):
.gcloudignore
.git
.gitignore
.hgignore
.hg/
*.pyc
*.pyo
__pycache__/
/setup.cfg
README.md
6. تعديل ملف نموذج HTML
1. نقل ملف النموذج
في مجلد مستودع الرموز الأساسية (الوحدة 0)، يوجد ملف نموذج index.html في المجلد نفسه الذي يحتوي على ملفات التطبيق. بما أنّ Flask يتطلّب وضع ملفات HTML في مجلد templates، عليك إنشاء هذا المجلد (mkdir templates) ونقل index.html إليه. في نظام متوافق مع POSIX، مثل Linux أو Mac OS X، ستكون الأوامر كما يلي:
mkdir templates
mv index.html templates
2. تعديل ملف النموذج
بعد نقل index.html إلى templates، حان الوقت لإجراء تعديل صغير ولكنّه مطلوب. لنلقِ نظرة على ملف النموذج الأصلي بالكامل:
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
</body>
</html>
في المقابل، يستخدم webapp2 نماذج Django التي تنفّذ عناصر قابلة للاستدعاء مثل visit.timestamp.ctime بدون أقواس ( )، بينما يتطلّب Jinja2 تحديدها بشكل صريح. على الرغم من أنّ هذا التعديل يبدو بسيطًا، إلا أنّ قوالب Jinja أكثر فعاليةً من البداية لأنّه يمكنك تمرير وسيطات في المكالمات.
في Django، عليك إنشاء "علامة نموذج" أو كتابة فلتر. بعد فهم ذلك، عدِّل index.html من خلال إضافة زوج من الأقواس إلى طلب visit.timestamp.ctime:
- قبل:
<li>{{ visit.timestamp.ctime }} from {{ visit.visitor }}</li>
- AFTER:
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
هذا هو التغيير الوحيد المطلوب، ولا يلزم إجراء أي تغييرات إضافية على index.html في جميع دروس الترميز المتبقية المتعلّقة بنقل البيانات.
7. الملخّص/التنظيف
نشر التطبيق
بعد إكمال جميع التغييرات في هذا البرنامج التعليمي، يجب أن تكون الملفات في مجلد التطبيق مماثلة (أو قريبة من ذلك) للملف الموجود في مجلد مستودع الوحدة 1. الآن، يمكنك نشر تطبيق Flask والتحقّق من أنّه يعمل بشكل مطابق للإصدار webapp2 من الوحدة 0.
استخدِم الأمر gcloud app deploy كما فعلنا سابقًا عند نشر الرمز الأصلي للوحدة 0. الوصول إلى التطبيق على PROJECT_ID.appspot.com، سواء من متصفّح ويب أو من خلال الأمر curl أو wget للتأكّد من أنّه يعمل على النحو المتوقّع
إذا ظهر لك نوع من أخطاء الخادم، يعني ذلك عادةً حدوث خطأ إملائي في رمز Python. راجِع سجلّات التطبيق للتحقيق في الأمر. قارِن أيضًا ملفاتك بالملفات الموجودة في مستودع الوحدة 1 (الرابط أعلاه مباشرةً).
اختياري: التنظيف
ماذا عن التنظيف لتجنُّب تحصيل الرسوم منك إلى أن تصبح مستعدًا للانتقال إلى الدرس العملي التالي حول نقل البيانات؟ بصفتك مطوّرًا حاليًا، من المحتمل أنّك على دراية بمعلومات الأسعار في App Engine.
اختياري: إيقاف التطبيق
إذا لم تكن مستعدًا للانتقال إلى البرنامج التعليمي التالي بعد، يمكنك إيقاف تطبيقك لتجنُّب تحمّل رسوم. عندما تكون مستعدًا للانتقال إلى درس تطبيقي حول الترميز التالي، يمكنك إعادة تفعيلها. أثناء إيقاف تطبيقك، لن يتلقّى أي زيارات تؤدي إلى تحمّل رسوم، ولكن هناك أمر آخر يمكن أن يتم تحصيل رسوم مقابله وهو استخدام Datastore إذا تجاوز الحصة المجانية، لذا احذف ما يكفي من البيانات ليكون الاستخدام أقل من هذا الحد.
من ناحية أخرى، إذا كنت لن تواصل عمليات النقل وأردت حذف كل شيء تمامًا، يمكنك إيقاف مشروعك.
الخطوات التالية
هناك وحدتان لنقل البيانات تبدآن برمز الوحدة 1 المكتمل، وهما الوحدتان 2 و7:
- الوحدة 2 (مطلوبة إذا كنت تستخدم Datastore)
- نقل البيانات من App Engine
ndbإلى Cloud NDB - بعد التبديل إلى Cloud NDB، تتوفّر العديد من الخيارات الأخرى
- تضمين تطبيقك في حاوية لتشغيله على Cloud Run
- نقل تطبيقك إلى مكتبة برامج Cloud Datastore
- نقل تطبيقك إلى Cloud Firestore للوصول إلى ميزات Firebase
- نقل البيانات من App Engine
- الوحدة 7 (مطلوبة إذا كنت تستخدم قوائم انتظار المهام [push])
- إضافة استخدام
taskqueueفي App Engine (إشعارات فورية) - تجهيز تطبيق الوحدة 1 لنقله إلى Cloud Tasks في الوحدة 8
- إضافة استخدام
8. مراجع إضافية
مشاكل/ملاحظات حول دروس الترميز التطبيقية الخاصة بوحدة نقل البيانات في App Engine
إذا واجهت أي مشاكل في هذا الدرس العملي، يُرجى البحث عن مشكلتك أولاً قبل إرسالها. روابط للبحث عن مشاكل جديدة وإنشائها:
مراجع لنقل البيانات
يمكنك العثور على روابط لمجلدات المستودع لكل من الوحدة 0 (البدء) والوحدة 1 (الإنهاء) في الجدول أدناه. يمكن أيضًا الوصول إليها من مستودع جميع عمليات نقل البيانات في App Engine الذي يمكنك استنساخه أو تنزيل ملف ZIP منه.
Codelab | Python 2 | Python 3 |
الوحدة رقم 0 | (غير متوفر) | |
الوحدة 1 | (غير متوفر) |
موارد App Engine
في ما يلي مراجع إضافية بشأن عملية النقل المحدّدة هذه:
- أُطر عمل الويب الصغيرة في Python
- (قديم) الترحيل من الإصدار 2.5 من Python إلى الإصدار 2.7 ومن
webappإلىwebapp2 - نقل البيانات إلى Python 3 وبيئة التشغيل من الجيل التالي في "محرّك تطبيقات Google"
- معلومات عامة