1. نظرة عامة
تهدف هذه السلسلة من الدروس التطبيقية حول الترميز (البرامج التعليمية العملية الذاتية) إلى مساعدة مطوّري Google App Engine (الإصدار العادي) على تحديث تطبيقاتهم من خلال إرشادهم خلال سلسلة من عمليات نقل البيانات. وأهم خطوة هي التوقف عن استخدام الخدمات المجمّعة لوقت التشغيل الأصلي، لأنّ الجيل التالي من بيئات التشغيل أكثر مرونة، ما يمنح المستخدمين مجموعة أكبر من خيارات الخدمة. يتيح لك الانتقال إلى بيئة التشغيل من الجيل الأحدث الدمج مع منتجات Google Cloud بسهولة أكبر واستخدام مجموعة أكبر من الخدمات المتوافقة وإتاحة إصدارات اللغات الحالية.
يعرض هذا الدليل التوجيهي الأولي خطوات نقل البيانات الأولى لتحديث إطار عمل الويب في تطبيقات App Engine: الانتقال من webapp2
إلى Flask. في تطبيقك، يمكنك استخدام أي إطار عمل على الويب يوفّر التوجيه، ولكن في هذا البرنامج التعليمي، نستخدم تطبيق Flask لأنّه يُستخدَم على نطاق واسع من قِبل المنتدى.
ستتعرَّف على كيفية
- استخدام مكتبات تابعة لجهات خارجية (مدمجة أو غير ذلك)
- تحديث ملفات الإعداد
- نقل بيانات تطبيق بسيط من "
webapp2
" إلى تطبيق Flask
المتطلبات
- مشروع Google Cloud Platform مع:
- المهارات الأساسية في لغة بايثون
- معرفة عملية بأوامر 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 إطار عمل يريد نقل التطبيق الخاص بك إليه، يمكنك اختيار إطار عمل آخر ما دام هذا الإطار يعمل وفقًا لتوجيهه الخاص. يوضّح هذا الدرس التطبيقي حول الترميز لصناع القرار في مجال تكنولوجيا المعلومات (ITDM) والمطوّرين خطوات نقل البيانات، حتى تتمكّن من التعرّف على هذه العملية بغض النظر عن إطار العمل الذي يتم النقل إليه فعليًا.
في ما يلي الخطوات الأساسية لعملية النقل هذه:
- الإعداد/التمهيد
- إضافة مكتبة Flask التابعة لجهة خارجية
- تحديث ملفات التطبيق
- تعديل ملف نموذج HTML
3- الإعداد/التمهيد
قبل البدء في الجزء الأساسي من البرنامج التعليمي، لنبدأ إعداد مشروعنا والحصول على الرمز البرمجي ثم (إعادة) تعريفك بالأمر gcloud
ونشر التطبيق الأساسي حتى نعرف أنّنا بدأنا بالرمز البرمجي للعمل.
1. إعداد المشروع
إذا كنت مطوّرًا حاليًا، من المرجّح أن تعرض لوحة بيانات App Engine الخدمات التي تشغّلها. لأغراض هذا البرنامج التعليمي، ننصحك بإنشاء مشروع جديد تمامًا أو إعادة استخدام مشروع حالي لهذا البرنامج التعليمي. عليك التأكّد من أنّ المشروع يتضمّن حساب فوترة نشطًا وأنّه تم تفعيل App Engine (تطبيق).
2. تنزيل نموذج تطبيق أساسي
ويحتوي مستودع نقل البيانات في GAE على جميع الرموز التي تحتاج إليها. عليك نسخ الملف أو تنزيل ملف ZIP. في هذا البرنامج التعليمي، ستبدأ بالرمز البرمجي في مجلد الوحدة 0 (START) وعند إكمال البرنامج التعليمي، يجب أن تتطابق التعليمة البرمجية مع مجلد الوحدة النمطية 1 (FINISH). إذا لم يكن الأمر كذلك، فاطلع على الاختلافات حتى تتمكن من الانتقال إلى التمرين المعملي التالي.
- START: رمز الوحدة 0
- FINISH: رمز الوحدة 1
- المستودع بالكامل (لاستنساخ ملف ZIP أو تنزيله)
يجب أن يحتوي مجلد "الوحدة 0" على ملفات على النحو التالي، كما هو موضّح في الأمر POSIX ls
:
$ ls
app.yaml index.html main.py
3- (إعادة) التعرّف على أوامر gcloud
إذا لم يكن لديك الأمر gcloud
على جهازك بعد، يمكنك تثبيت حزمة تطوير البرامج (SDK) لخدمة Google Cloud والتأكّد من توفّر gcloud
كجزء من مسار التنفيذ والتعرّف على أوامر gcloud
التالية:
gcloud components update
: تحديث حزمة تطوير البرامج (SDK) لخدمة Google Cloudgcloud auth login
— سجّل الدخول إلى حسابك المعتمدgcloud config list
- إدراج إعدادات ضبط مشروع Google Cloud Platformgcloud config set project PROJECT_ID
- ضبط رقم تعريف مشروع Google Cloud Platformgcloud 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 في مستندات الطلبات والتوجيه.
بعد نشر التطبيق، أعِد تحميل المتصفح (ربما عدة مرات) للاطّلاع على آخر الزيارات:
وإذا كان تطبيقك جديدًا، سترى زيارة واحدة فقط أو بضع زيارات.
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 إجراءات:
- التعامل مع طلبات 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 التالية:
- بعد:
@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
- نقل البيانات من App Engine
- الوحدة 7 (مطلوبة في حال استخدام [push] قوائم انتظار المهام)
- إضافة استخدام App Engine (الإشعارات الفورية)
taskqueue
- إعداد تطبيق الوحدة 1 للنقل إلى مهام Cloud في الوحدة 8
- إضافة استخدام App Engine (الإشعارات الفورية)
8. مراجع إضافية
المشاكل/الملاحظات في الدروس التطبيقية حول ترميز وحدة نقل بيانات App Engine
إذا وجدت أي مشاكل في هذا الدرس التطبيقي حول الترميز، يُرجى البحث عن مشكلتك أولاً قبل ملء النموذج. روابط للبحث وإنشاء مشاكل جديدة:
موارد نقل البيانات
يمكن العثور على روابط لمجلدات repo للوحدة 0 (START) والوحدة 1 (FINISH) في الجدول أدناه. ويمكن الوصول إليها أيضًا من المستودع لجميع عمليات نقل بيانات App Engine التي يمكنك استنساخ ملف ZIP أو تنزيله.
Codelab | Python 2 | Python 3 |
الوحدة 0 | (لا ينطبق) | |
الوحدة 1 | (لا ينطبق) |
موارد App Engine
في ما يلي مراجع إضافية بشأن عملية النقل هذه:
- أطر عمل Python المصغَّرة على الويب
- (القديم) الانتقال من Python 2.5 إلى 2.7 و
webapp
إلىwebapp2
- الانتقال إلى بيئة تشغيل الجيل التالي لكل من Python 3 وGAE
- عام