الوحدة النمطية 1: النقل من App Engine webapp2 إلى Flask

1. نظرة عامة

تهدف هذه السلسلة من الدروس التطبيقية حول الترميز (البرامج التعليمية العملية الذاتية) إلى مساعدة مطوّري Google App Engine (الإصدار العادي) على تحديث تطبيقاتهم من خلال إرشادهم خلال سلسلة من عمليات نقل البيانات. وأهم خطوة هي التوقف عن استخدام الخدمات المجمّعة لوقت التشغيل الأصلي، لأنّ الجيل التالي من بيئات التشغيل أكثر مرونة، ما يمنح المستخدمين مجموعة أكبر من خيارات الخدمة. يتيح لك الانتقال إلى بيئة التشغيل من الجيل الأحدث الدمج مع منتجات Google Cloud بسهولة أكبر واستخدام مجموعة أكبر من الخدمات المتوافقة وإتاحة إصدارات اللغات الحالية.

يعرض هذا الدليل التوجيهي الأولي خطوات نقل البيانات الأولى لتحديث إطار عمل الويب في تطبيقات App Engine: الانتقال من webapp2 إلى Flask. في تطبيقك، يمكنك استخدام أي إطار عمل على الويب يوفّر التوجيه، ولكن في هذا البرنامج التعليمي، نستخدم تطبيق Flask لأنّه يُستخدَم على نطاق واسع من قِبل المنتدى.

ستتعرَّف على كيفية

  • استخدام مكتبات تابعة لجهات خارجية (مدمجة أو غير ذلك)
  • تحديث ملفات الإعداد
  • نقل بيانات تطبيق بسيط من "webapp2" إلى تطبيق Flask

المتطلبات

استطلاع

كيف ستستخدم هذا الدرس التطبيقي حول الترميز؟

قراءة النص فقط اقرأها وأكمِل التمارين

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 إطار عمل يريد نقل التطبيق الخاص بك إليه، يمكنك اختيار إطار عمل آخر ما دام هذا الإطار يعمل وفقًا لتوجيهه الخاص. يوضّح هذا الدرس التطبيقي حول الترميز لصناع القرار في مجال تكنولوجيا المعلومات (ITDM) والمطوّرين خطوات نقل البيانات، حتى تتمكّن من التعرّف على هذه العملية بغض النظر عن إطار العمل الذي يتم النقل إليه فعليًا.

في ما يلي الخطوات الأساسية لعملية النقل هذه:

  1. الإعداد/التمهيد
  2. إضافة مكتبة Flask التابعة لجهة خارجية
  3. تحديث ملفات التطبيق
  4. تعديل ملف نموذج HTML

3- الإعداد/التمهيد

قبل البدء في الجزء الأساسي من البرنامج التعليمي، لنبدأ إعداد مشروعنا والحصول على الرمز البرمجي ثم (إعادة) تعريفك بالأمر gcloud ونشر التطبيق الأساسي حتى نعرف أنّنا بدأنا بالرمز البرمجي للعمل.

1. إعداد المشروع

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

2. تنزيل نموذج تطبيق أساسي

ويحتوي مستودع نقل البيانات في GAE على جميع الرموز التي تحتاج إليها. عليك نسخ الملف أو تنزيل ملف ZIP. في هذا البرنامج التعليمي، ستبدأ بالرمز البرمجي في مجلد الوحدة 0 (START) وعند إكمال البرنامج التعليمي، يجب أن تتطابق التعليمة البرمجية مع مجلد الوحدة النمطية 1 (FINISH). إذا لم يكن الأمر كذلك، فاطلع على الاختلافات حتى تتمكن من الانتقال إلى التمرين المعملي التالي.

يجب أن يحتوي مجلد "الوحدة 0" على ملفات على النحو التالي، كما هو موضّح في الأمر POSIX ls:

$ ls
app.yaml        index.html      main.py

3- (إعادة) التعرّف على أوامر gcloud

إذا لم يكن لديك الأمر gcloud على جهازك بعد، يمكنك تثبيت حزمة تطوير البرامج (SDK) لخدمة Google Cloud والتأكّد من توفّر gcloud كجزء من مسار التنفيذ والتعرّف على أوامر gcloud التالية:

  1. gcloud components update: تحديث حزمة تطوير البرامج (SDK) لخدمة Google Cloud
  2. gcloud auth login — سجّل الدخول إلى حسابك المعتمد
  3. gcloud config list - إدراج إعدادات ضبط مشروع Google Cloud Platform
  4. gcloud config set project PROJECT_ID - ضبط رقم تعريف مشروع Google Cloud Platform
  5. gcloud app deploy — نشر تطبيق App Engine

إذا لم تكن قد بدأت في تطوير App Engine باستخدام gcloud مؤخرًا، عليك تشغيل أول أربعة أوامر (رقم 1 إلى 4) للانتهاء من عملية الإعداد قبل الانتقال إلى الخطوات التالية. لنلقي نظرة عامة سريعة على هذه الأوامر.

أولاً، يضمن gcloud components update حصولك على أحدث إصدار من حزمة تطوير البرامج (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 في مستندات الطلبات والتوجيه.

بعد نشر التطبيق، أعِد تحميل المتصفح (ربما عدة مرات) للاطّلاع على آخر الزيارات:

تطبيق findme

وإذا كان تطبيقك جديدًا، سترى زيارة واحدة فقط أو بضع زيارات.

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. عمليات الاستيراد

تأتي عمليات الاستيراد أولاً كما هو الحال في جميع ملفات بايثون. تلي عملية استيراد إطار العمل webapp2 مكتبة مخزن بيانات ndb، وأخيرًا إضافة App Engine التي تعالج نماذج Django المصممة. من المفترض أن يظهر لك ما يلي:

  • قبل:
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.webapp import template

عند الانتقال إلى تطبيق Flask، يمكنك استيراد كلّ من Flask وقطع عارض النماذج في الوقت نفسه. احذف زوج عمليات الاستيراد ذات الصلة بـ webapp2 واستبدلهما على النحو التالي (اترك عملية استيراد ndb كما هي):

  • بعد:
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. تتطلّب القارورة أيضًا الإعداد، لذا أضِف السطر التالي في أعلى main.py أسفل عمليات الاستيراد مباشرةً:

  • بعد:
app = Flask(__name__)

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

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

3- نموذج البيانات

ما مِن تغييرات هنا. سيكون مخزن البيانات محور الدرس التطبيقي التالي حول الترميز.

4. المعالِجات

ينفِّذ التطبيق، بغض النظر عن إطار العمل الذي تستخدمه (webapp2 أو Flask)، 3 إجراءات:

  1. التعامل مع طلبات GET مسار الجذر (/)
  2. تسجيل "زيارة" إحدى صفحات الويب (إنشاء/تخزين عنصر واحد (Visit))
  3. عرض أهم 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 التالية:

  • بعد:
@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 الإضافية وعناصر التحكم في المصدر ونموذج Repo والعناصر الأخرى. يظهر رمز .gcloudignore على النحو التالي (مع إزالة التعليقات للإيجاز):

.gcloudignore
.git
.gitignore
.hgignore
.hg/
*.pyc
*.pyo
__pycache__/
/setup.cfg
README.md

6- تعديل ملف نموذج HTML

1. نقل ملف النموذج

في مجلد Repo الأساسي (الوحدة 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>
  • بعد:
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>

هذا هو التغيير الوحيد المطلوب؛ لا يلزم إجراء أي تغييرات إضافية على index.html في جميع الدروس التطبيقية المتبقية حول ترميز نقل البيانات.

7. الملخّص/تنظيف البيانات

نشر التطبيق

عند الانتهاء من جميع التغييرات في هذا البرنامج التعليمي، يجب أن تكون الملفات في مجلد التطبيق متطابقة (أو تقريبًا) للملف الموجود في مجلد Repo للوحدة 1. انشر الآن وشاهد تطبيق الوحدة النمطية 1 Flask يعمل بالشكل نفسه مع إصدار الوحدة 0 webapp2.

استخدِم الأمر gcloud app deploy كما فعلنا سابقًا عند نشر رمز الوحدة 0 الأصلي. يتم الوصول إلى التطبيق من خلال PROJECT_ID.appspot.com، سواء من خلال متصفّح ويب أو أمر curl أو wget للتأكّد من عمله على النحو المتوقّع.

إذا واجهت خطأً ما في الخادم، فهذا يعني عادةً وجود خطأ إملائي في رمز Python الخاص بك. ألق نظرة على سجلات التطبيق للتحقيق في الأمر. قارن أيضًا ملفاتك مع الملفات الموجودة في مستودع الوحدة 1 (الرابط أعلاه).

اختياري: إخلاء مساحة تخزين

ماذا عن تنظيف البيانات لتجنُّب تحصيل الرسوم منك إلى أن تكون مستعدًا للانتقال إلى الدرس التالي حول ترميز عملية نقل البيانات؟ بصفتك مطوِّرًا حاليًا، من المرجّح أنّك على اطّلاع على معلومات أسعار App Engine.

اختياري: إيقاف التطبيق

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

من ناحية أخرى، إذا كنت لا تتابع عمليات نقل البيانات وأردت حذف كل البيانات بالكامل، يمكنك إيقاف مشروعك.

الخطوات التالية

هناك وحدتا نقل بيانات تبدأ برمز الوحدة 1 المكتمل، الوحدتين 2 و7:

  • الوحدة 2 (مطلوبة في حال استخدام خدمة "مخزن البيانات")
    • نقل البيانات من App Engine ndb إلى Cloud NDB
    • بعد التبديل إلى Cloud NDB، يصبح العديد من الخيارات الأخرى متاحًا
      • توفير حاويات في تطبيقك لتشغيله على Cloud Run
      • نقل تطبيقك إلى مكتبة برامج "تخزين البيانات في السحابة الإلكترونية"
      • نقل تطبيقك إلى Cloud Firestore للوصول إلى ميزات Firebase
  • الوحدة 7 (مطلوبة في حال استخدام [push] قوائم انتظار المهام)
    • إضافة استخدام App Engine (الإشعارات الفورية) taskqueue
    • إعداد تطبيق الوحدة 1 للنقل إلى مهام Cloud في الوحدة 8

8. مراجع إضافية

المشاكل/الملاحظات في الدروس التطبيقية حول ترميز وحدة نقل بيانات App Engine

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

موارد نقل البيانات

يمكن العثور على روابط لمجلدات repo للوحدة 0 (START) والوحدة 1 (FINISH) في الجدول أدناه. ويمكن الوصول إليها أيضًا من المستودع لجميع عمليات نقل بيانات App Engine التي يمكنك استنساخ ملف ZIP أو تنزيله.

Codelab

Python 2

Python 3

الوحدة 0

الرموز البرمجية

(لا ينطبق)

الوحدة 1

الرموز البرمجية

(لا ينطبق)

موارد App Engine

في ما يلي مراجع إضافية بشأن عملية النقل هذه: