1. نظرة عامة
تهدف سلسلة البرامج التعليمية حول Serverless Migration Station (برامج تعليمية ذاتية السرعة وعملية) ومقاطع الفيديو ذات الصلة إلى مساعدة مطوّري الحوسبة بدون خادم على Google Cloud في تحديث تطبيقاتهم من خلال إرشادهم خلال عملية نقل واحدة أو أكثر، مع التركيز بشكل أساسي على التخلّي عن الخدمات القديمة. يؤدي ذلك إلى زيادة قابلية نقل تطبيقاتك ويمنحك المزيد من الخيارات والمرونة، ما يتيح لك الدمج مع مجموعة أكبر من منتجات Cloud والوصول إليها، كما يسهّل عليك الترقية إلى أحدث إصدارات اللغة. على الرغم من أنّ هذه السلسلة تركّز في البداية على أوائل مستخدمي Cloud، وخاصةً مطوّري App Engine (البيئة العادية)، إلا أنّها واسعة النطاق بما يكفي لتشمل منصات أخرى بلا خادم، مثل Cloud Functions وCloud Run، أو في أي مكان آخر إذا كان ذلك منطبقًا.
يعلّمك هذا الدرس التطبيقي حول الترميز كيفية تضمين App Engine Memcache واستخدامه في نموذج التطبيق من الدرس التطبيقي حول الترميز في الوحدة 1. نضيف استخدام Memcache في هذا البرنامج التعليمي الخاص بالوحدة 12، ثم ننقل البيانات إلى Cloud Memorystore في الوحدة 13.
ستتعرَّف على كيفية إجراء ما يلي:
- استخدام واجهة برمجة التطبيقات/المكتبة App Engine Memcache
- إضافة التخزين المؤقت إلى تطبيق أساسي يستند إلى Python 2 Flask App Engine NDB
المتطلبات
- مشروع Google Cloud Platform مع حساب فوترة نشط على Google Cloud Platform
- مهارات أساسية في لغة Python
- معرفة عملية بالأوامر الشائعة على نظام التشغيل Linux
- معرفة أساسية بشأن تطوير ونشر تطبيقات App Engine
- تطبيق Module 1 App Engine يعمل (أكمِل الدرس التطبيقي حول الترميز [يُنصح بذلك] أو انسخ التطبيق من المستودع)
استطلاع
كيف ستستخدم هذا البرنامج التعليمي؟
كيف تقيّم تجربتك مع Python؟
ما هو تقييمك لتجربة استخدام خدمات Google Cloud؟
2. الخلفية
للانتقال من App Engine Memcache، أضِف استخدامها إلى تطبيق Flask وApp Engine NDB الحالي الناتج عن الدرس التطبيقي حول الترميز في الوحدة 1. يعرض نموذج التطبيق آخر عشر زيارات للمستخدم. إذا أعاد المستخدم نفسه تحميل المتصفح، لن يكون من الأفضل إنشاء كيانات زيارة جديدة باستمرار واسترداد أحدث الزيارات من Datastore، لذا سنخزّن أحدث الزيارات مؤقتًا.
إذا انتقل الزائر نفسه إلى الصفحة، يتم عرض الزيارات من ذاكرة التخزين المؤقت. إذا زار مستخدم جديد الموقع الإلكتروني أو مرّت ساعة، يتم إفراغ ذاكرة التخزين المؤقت واستبدالها بأحدث الإدخالات (بالإضافة إلى تسجيل زيارة جديدة). بعد تنفيذ عملية الدمج هذه في App Engine Memcache، يمكننا نقلها إلى Cloud Memorystore في الدرس التطبيقي حول الترميز التالي (الوحدة 13).
يتضمّن هذا الدليل التعليمي الخطوات التالية:
- الإعداد/العمل التحضيري
- تعديل الإعدادات
- تعديل الرمز البرمجي للتطبيق
3- الإعداد/العمل التحضيري
قبل الانتقال إلى الجزء الرئيسي من البرنامج التعليمي، لنعدّ مشروعنا ونحصل على الرمز البرمجي، ثم ننشر التطبيق الأساسي لنعرف أنّنا بدأنا برمز برمجي يعمل.
1. إعداد المشروع
إذا أكملت برنامج Module 1 التدريبي، ننصحك بإعادة استخدام المشروع (والرمز) نفسه. يمكنك بدلاً من ذلك إنشاء مشروع جديد تمامًا أو إعادة استخدام مشروع حالي آخر. تأكَّد من أنّ المشروع يتضمّن حساب فوترة نشطًا وأنّ خدمة App Engine مفعَّلة.
2. الحصول على نموذج تطبيق أساسي
من المتطلبات الأساسية لهذا الدرس التطبيقي حول الترميز أن يكون لديك تطبيق نموذجي يعمل في الوحدة 1. إذا لم يكن لديك تطبيق، يُرجى إكمال أحد البرنامجين التعليميين (الروابط أعلاه) قبل المتابعة هنا. وإذا كنت على دراية بمحتواه، يمكنك البدء برمز الوحدة 1 أدناه.
سواء استخدمت الرمز الخاص بك أو الرمز الذي نوفّره لك، سنبدأ بالرمز البرمجي للوحدة 1. يرشدك هذا الدرس العملي خلال كل خطوة، وينتهي برمز يشبه الرمز الموجود في مجلد مستودع الوحدة التدريبية 11 (FINISH).
- البدء: وحدة 1 (Python 2)
- إنهاء: مجلد الوحدة 12 (Python 2)
- المستودع بأكمله (لاستنساخ ملف ZIP أو تنزيله)
يجب أن يبدو دليل ملفات البدء للوحدة التدريبية 1 (الخاصة بك أو بنا) على النحو التالي:
$ ls README.md main.py templates app.yaml requirements.txt
3- (إعادة) نشر التطبيق الأساسي
في ما يلي الخطوات المتبقية التي يجب تنفيذها الآن:
- التعرّف من جديد على أداة سطر الأوامر
gcloud - إعادة نشر نموذج التطبيق باستخدام
gcloud app deploy - تأكَّد من أنّ التطبيق يعمل على App Engine بدون أي مشاكل
بعد تنفيذ هذه الخطوات بنجاح والتأكّد من أنّ تطبيق الويب يعمل (مع إخراج مشابه لما يلي)، ستكون جاهزًا لإضافة استخدام التخزين المؤقت إلى تطبيقك.

4. تعديل الإعدادات
لا يلزم إجراء أي تغييرات على ملفات الإعدادات العادية في App Engine (app.yaml وrequirements.txt وappengine_config.py).
5- تعديل ملفات التطبيق
بما أنّنا نضيف فقط واجهة برمجة تطبيقات App Engine، لا تتضمّن هذه العملية أي حِزم خارجية، ما يعني أنّه ليس من الضروري تعديل أي ملفات إعداد (app.yaml وrequirements.txt وappengine_config.py). لا يوجد سوى ملف تطبيق واحد، وهو main.py، لذا تؤثر جميع التغييرات في هذا القسم في هذا الملف فقط.
عمليات الاستيراد
الخطوة الأكثر أهمية هي استيراد مكتبة Memcache، google.appengine.api.memcache. بما أنّنا سنخزّن مؤقتًا أحدث الزيارات لمدة ساعة، لنضِف أيضًا ثابتًا لعدد الثواني في الساعة. في ما يلي الشكل الذي يبدو عليه الرمز قبل هذا التغيير:
قبل:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
app = Flask(__name__)
بعد:
from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb
app = Flask(__name__)
HOUR = 3600
إضافة التخزين المؤقت مع إمكانية استخدام Memcache
أهم تغيير هو إضافة استخدام التخزين المؤقت في تطبيقنا. وبشكل أكثر تحديدًا، يجب تخزين الزيارات الأخيرة مؤقتًا، والتحقّق مما إذا كانت الزيارات المخزّنة مؤقتًا متاحة، ومحاولة استخدام النتائج المخزّنة مؤقتًا قدر الإمكان وفقًا لخطة العمل. في ما يلي الخطوات التي سيتّخذها التطبيق لتحقيق هدفنا:
- ضبط الزيارة الحالية وتسميتها
visitor - محاولة استرجاع أحدث
visitsمن ذاكرة التخزين المؤقت - إذا كانت ذاكرة التخزين المؤقّت فارغة أو كان آخر زائر (
visits[0]['visitor']) مختلفًا عنvisitorالحالي: خزِّن هذه الزيارة الأحدث، واسترجِع الزيارات الأخيرة، وخزِّنها مؤقتًا لمدة ساعة. - عرض
visitsللمستخدم من خلال نموذج الويب
في ما يلي التغييرات التي ستظهر قبل هذه التعديلات وبعدها:
قبل:
@app.route('/')
def root():
'main application (GET) handler'
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10)
return render_template('index.html', visits=visits)
بعد:
@app.route('/')
def root():
'main application (GET) handler'
# check for (hour-)cached visits
ip_addr, usr_agt = request.remote_addr, request.user_agent
visitor = '{}: {}'.format(ip_addr, usr_agt)
visits = memcache.get('visits')
# register visit & run DB query if cache empty or new visitor
if not visits or visits[0]['visitor'] != visitor:
store_visit(ip_addr, usr_agt)
visits = list(fetch_visits(10))
memcache.set('visits', visits, HOUR) # set() not add()
return render_template('index.html', visits=visits)
في ما يلي تمثيل صوري للتغييرات التي تم إجراؤها:

بهذا نكون قد أكملنا جميع التغييرات اللازمة لإضافة استخدام App Engine memcache إلى نموذج التطبيق في الوحدة 1. لننشئ هذا التطبيق وننشره لنرى كيف يعمل.
6. الملخّص/التنظيف
يختتم هذا القسم الدرس التطبيقي حول الترميز من خلال تفعيل التطبيق والتأكّد من عمله على النحو المطلوب وفي أي ناتج معروض. بعد التحقّق من التطبيق، اتّخِذ أي خطوات تنظيف وفكِّر في الخطوات التالية.
نشر التطبيق والتحقّق منه
أعِد نشر تطبيقك باستخدام gcloud app deploy، وتأكَّد من أنّه يعمل. يجب أن يتطابق الرمز البرمجي الآن مع ما هو موجود في FINISH، أي المجلد 12. يجب أن تكون النتيجة مماثلة لتطبيق الوحدة 1 الذي نشرته سابقًا:

كل ما فعلناه هو تسريع تجربة المستخدم نفسه. عند إعادة التحميل، من المفترض أن تحصل على النتائج مباشرةً من ذاكرة التخزين المؤقت، ما لا يؤدي إلى إنشاء زيارة جديدة أو إجراء عملية جلب من Datastore.
تهانينا على إكمال الدرس التطبيقي حول الترميز رقم 12 حول إضافة استخدام خدمة App Engine memcache إلى تطبيقنا النموذجي. يمكنك الآن نقل تطبيق Python 2 هذا إلى Python 3 في الخطوة الإضافية.
تَنظيم
للجمهور العام
إذا انتهيت من استخدام التطبيق في الوقت الحالي، ننصحك بإيقاف تطبيق App Engine لتجنُّب تحمّل رسوم. ومع ذلك، إذا أردت إجراء المزيد من الاختبارات أو التجارب، تتضمّن منصة App Engine حصّة مجانية، وبالتالي لن يتم تحصيل رسوم منك طالما أنّك لا تتجاوز مستوى الاستخدام هذا. هذا السعر خاص بالحوسبة، ولكن قد تكون هناك رسوم أيضًا مقابل خدمات App Engine ذات الصلة، لذا يُرجى الاطّلاع على صفحة الأسعار للحصول على مزيد من المعلومات. إذا كان نقل البيانات هذا يتضمّن خدمات سحابية أخرى، يتم إصدار فواتير لها بشكل منفصل. في كلتا الحالتين، إذا كان ذلك منطبقًا، راجِع القسم "خاص بهذا الدرس التطبيقي حول الترميز" أدناه.
للتوضيح، يؤدي النشر على منصة حوسبة بدون خادم في Google Cloud، مثل App Engine، إلى تكبُّد تكاليف بسيطة للإنشاء والتخزين. تتضمّن Cloud Build حصة مجانية خاصة بها، وكذلك Cloud Storage. ويؤدي تخزين هذه الصورة إلى استهلاك جزء من هذه الحصة. ومع ذلك، قد تكون مقيمًا في منطقة لا تتوفّر فيها هذه الطبقة المجانية، لذا عليك الانتباه إلى استخدامك لمساحة التخزين لتقليل التكاليف المحتملة. تتضمّن "المجلدات" المحدّدة في Cloud Storage التي يجب مراجعتها ما يلي:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- تعتمد روابط مساحة التخزين أعلاه على
PROJECT_IDو *LOC*، على سبيل المثال، "us" إذا كان تطبيقك مستضافًا في الولايات المتحدة.
من ناحية أخرى، إذا كنت لن تواصل استخدام هذا التطبيق أو غيره من الدروس التعليمية البرمجية المتعلقة بنقل البيانات وأردت حذف كل شيء تمامًا، عليك إيقاف مشروعك.
خاص بهذا الدرس التطبيقي حول الترميز
الخدمات المدرَجة أدناه خاصة بهذا الدرس التطبيقي حول الترميز. يُرجى الرجوع إلى مستندات كل منتج للحصول على مزيد من المعلومات:
- تتوفّر خدمة App Engine Memcache بنوعَين مختلفَين، ولكلّ منهما نظام أسعار خاص به، لذا عليك تتبُّع هذا الاستخدام حسب الفوترة.
- يتم توفير خدمة App Engine Datastore من خلال Cloud Datastore (Cloud Firestore في وضع Datastore) الذي يتضمّن أيضًا طبقة مجانية. يمكنك الاطّلاع على صفحة الأسعار للحصول على مزيد من المعلومات.
الخطوات التالية
يتم تناول عملية النقل المنطقية التالية في الوحدة 13، حيث يتم توضيح كيفية نقل البيانات من خدمة App Engine memcache إلى Cloud Memorystore. جميع عمليات النقل هذه اختيارية ومتاحة للمستخدمين الذين يريدون اتّخاذ خطوات مختلفة لتحديث تطبيقاتهم. تُعدّ خدمة Cloud Memorystore ترقية كبيرة لـ memcache في App Engine لأسباب عديدة:
- لا يمكن استخدام Cloud Memorystore بدون خادم. وهذا يعني أنّه عليك تخصيص خادم لذاكرة التخزين المؤقت. لا تتوفّر أيضًا طبقة مجانية في Cloud Memorystore. ويمكن أن يكون لهذين العاملَين تأثير كبير على التكلفة.
- تتيح خدمة Cloud Memorystore استخدام آليتَي تخزين أساسيتَين مختلفتَين (محركات التخزين المؤقت)، وهما Redis وMemcached.
- تتضمّن Cloud Memorystore (for Redis) مجموعة خصائص أكثر شمولاً وتفصيلاً من App Engine Memcache.
- لاستخدام Cloud Memorystore، عليك إعداد خادم Cloud Memorystore وإضافته إلى شبكة Google Cloud VPC، ثم جعل تطبيق App Engine يستخدم هذه الشبكة للتواصل مع خادم Memorystore.
إذا كنت لا تحتاج إلى جميع الميزات المتوفّرة من Cloud Memorystore أو كنت قلقًا بشأن تأثيرها في التكلفة، يمكنك البقاء على App Engine Memcache.
بالإضافة إلى الوحدة 13، هناك مجموعة كبيرة من عمليات النقل المحتملة الأخرى، مثل Cloud NDB وCloud Datastore أو Cloud Tasks. تتوفّر أيضًا عمليات نقل بيانات بين المنتجات إلى Cloud Run وCloud Functions. يمكنك العثور عليها جميعًا في مستودع نقل البيانات.
هناك خطوة أخرى محتملة وهي تكييف البرنامج إلى Python 3، والتي سيتم تناولها في القسم التالي كخطوة اختيارية.
7. مكافأة: الانتقال إلى الإصدار 3 من Python
نظرة عامة
يتضمّن هذا القسم محتوًى إضافيًا اختياريًا ينقل تطبيق الوحدة 12 الذي انتهينا منه أعلاه إلى Python 3. نبدأ بالإعدادات ثم التطبيق.
تبسيط ملف app.yaml
من مزايا وقت تشغيل Python 3 أنّه يمكن تبسيط app.yaml بشكل كبير.
قبل:
في ما يلي محتوى app.yaml في نهاية الوحدة 12:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
بما أنّ وقت تشغيل Python 3 يتطلّب أن تقوم أُطر عمل الويب بتنفيذ التوجيه الخاص بها، يجب تغيير جميع معالجات المسارات في app.yaml إلى auto. إذا لم يتم عرض أي ملفات ثابتة، يمكن للمستخدمين إزالة قسم handlers: بأكمله. بالإضافة إلى ذلك، تم إيقاف كلّ من threadsafe وapi_version نهائيًا.
بعد:
مع التغييرات المطلوبة الموضّحة للتو، إليك الرمز البديل app.yaml للغة Python 3:
runtime: python39
app_engine_apis: true
السطر الوحيد الذي يحتاج إلى توضيح هو app_engine_apis: true. عندما أصبحت خدمات App Engine القديمة متاحة لأوقات التشغيل من الجيل الثاني في عام 2021، تطلّبت بعض أوقات التشغيل، بما في ذلك Python 3، عملية إعداد إضافية للوصول إلى واجهات برمجة التطبيقات هذه، مثل ndb وtaskqueue وmemcache. يؤدي هذا السطر في الإعدادات هذا الغرض.
تعديل ملف requirements.txt
يجب إجراء عملية إعداد أخرى لواجهات برمجة التطبيقات الأصلية في requirements.txt: يجب تضمين إمكانية الوصول إلى حزمة تطوير البرامج (SDK) الجديدة في App Engine.
قبل:
في ما يلي محتوى app.yaml في نهاية الوحدة 12:
flask
بعد:
ما عليك سوى إضافة حزمة تطوير البرامج (SDK) الخاصة بلغة Python في App Engine، وسيتوفّر لك ما يلي:
flask
appengine-python-standard
حذف ملف appengine_config.py والمجلد lib
تعديل استخدام حِزم الجهات الخارجية في أوقات تشغيل الجيل التالي من App Engine:
- المكتبات المضمّنة هي تلك التي تحقّقت منها Google وأتاحتها على خوادم App Engine، وذلك على الأرجح لأنّها تحتوي على رمز C/C++ الذي لا يُسمح للمطوّرين بنشره على السحابة الإلكترونية، ولم تعُد هذه المكتبات متاحة في أوقات التشغيل من الجيل الثاني.
- لم يعُد من الضروري نسخ المكتبات غير المضمّنة (المعروفة أحيانًا باسم "البيع" أو "التجميع الذاتي") في أوقات التشغيل من الجيل الثاني. بدلاً من ذلك، يجب إدراجها في
requirements.txtحيث يثبّتها نظام التصميم تلقائيًا نيابةً عنك في وقت النشر.
نتيجةً لهذه التغييرات في إدارة حِزم الجهات الخارجية، لن تحتاج إلى الملف appengine_config.py أو المجلد lib، لذا احذفهما. في أوقات التشغيل من الجيل الثاني، يثبِّت App Engine تلقائيًا حِزم الجهات الخارجية المُدرَجة في requirements.txt. تلخيص:
- عدم تضمين مكتبات تابعة لجهات خارجية أو نسخها أو تجميعها ذاتيًا، ويجب إدراجها في
requirements.txt - لا يمكن وضع
pip installفي مجلدlib، ما يعني عدم إمكانية إنشاء مجلدlibعلى الإطلاق - لا تتضمّن بطاقة البيانات مكتبات مضمّنة تابعة لجهات خارجية (وبالتالي لا يوجد قسم
libraries) فيapp.yaml، بل يجب إدراجها فيrequirements.txt - عدم توفّر أي مكتبات تابعة لجهات خارجية يمكن الرجوع إليها من تطبيقك يعني عدم توفّر ملف
appengine_config.py
إنّ إدراج جميع مكتبات الجهات الخارجية المطلوبة في requirements.txt هو الشرط الوحيد الذي يجب أن يستوفيه المطوّر.
تحديث التطبيق لاستخدام حزمة تطوير البرامج (SDK) في App Engine
كما ذكرنا أعلاه، تتطلّب تطبيقات Python 3 إجراء بعض التعديلات للوصول إلى الخدمات المجمّعة في App Engine:
- حزمة تطوير البرامج (SDK) في App Engine (في
requirements.txt) - تفعيل حزمة تطوير البرامج (SDK) في App Engine (في
app.yaml) - تغليف عنصر WSGI (في
main.py)
تم إكمال الزوج الأول أعلاه، لذا فإنّ الشرط الأخير هو تعديل main.py.
قبل:
في ما يلي main.py في Python 2 في نهاية الوحدة 12:
from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb
app = Flask(__name__)
HOUR = 3600
بعد:
بالنسبة إلى عملية نقل البيانات إلى Python 3، استورِد حزمة تطوير البرامج (SDK) واغلّف عنصر تطبيق Flask بها (برنامج تضمين حزمة تطوير البرامج)، ما يؤدي إلى ما يلي:
from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb
app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600
على المطوّرين إجراء هذه التغييرات على تطبيقات Python عند تكييفها من الإصدار 2.x إلى الإصدار 3.x للوصول إلى الخدمات المجمّعة. إذا كنت لا تستخدم Flask، يمكنك أيضًا الاطّلاع على أمثلة Django وPyramid في المستندات. إذا لم يكن رمز Python 2 البرمجي تطبيق ويب، يكفي تضمين حزمة تطوير البرامج (SDK) عند تكييف البرنامج إلى Python 3. تم تصميم الرمز البرمجي للتطبيق في الأصل ليعمل مع الإصدارين 2 و3 من Python، لذلك لا يلزم إجراء أي تغييرات إضافية على التوافق.
نشر التطبيق
بعد إكمال التغييرات المذكورة أعلاه، يمكنك نشر نموذج التطبيق المعدَّل. (لا توجد مشكلة عند نشر إصدار Python 3 من تطبيقك على إصدار Python 2 الأصلي في مشروع GCP نفسه). يجب أن يظل سلوك التطبيق كما هو. إذا كنت بحاجة إلى مقارنة تطبيقك المعدَّل بتطبيقنا، يمكنك الاطّلاع على المجلد 12b في مستودع النقل. لمزيد من المعلومات حول إتاحة الخدمات المجمّعة في App Engine في أحدث أوقات التشغيل، مثل Python 3، يمكنك الاطّلاع على إشعار إطلاق الميزة بالإضافة إلى الدرس التطبيقي حول الترميز حول الوحدة 17.
تهانينا على إكمال الخطوة الإضافية في الوحدة 12. يمكنك أيضًا الاطّلاع على المستندات حول إعداد ملفات الإعداد لوقت تشغيل Python 3. راجِع قسم "الملخّص/التنظيف" أعلاه لمعرفة الخطوات التالية وتنظيف البيانات.
8. مراجع إضافية
في ما يلي مراجع إضافية للمطوّرين الذين يريدون استكشاف هذه الوحدة أو وحدة نقل البيانات ذات الصلة بالإضافة إلى المنتجات ذات الصلة. ويشمل ذلك أماكن لتقديم ملاحظات حول هذا المحتوى، وروابط إلى الرمز، ومختلف أجزاء المستندات التي قد تجدها مفيدة.
مشاكل/ملاحظات بشأن الدروس التطبيقية حول الترميز
إذا واجهت أي مشاكل في هذا الدرس العملي، يُرجى البحث عن مشكلتك أولاً قبل إرسالها. روابط للبحث عن مشاكل جديدة وإنشائها:
مراجع لنقل البيانات
يمكنك العثور في الجدول أدناه على روابط لمجلدات المستودع الخاصة بالوحدة التدريبية 2 (البداية) والوحدة التدريبية 12 (النهاية). يمكن أيضًا الوصول إليها من مستودع جميع عمليات نقل Codelab في App Engine الذي يمكنك استنساخه أو تنزيل ملف ZIP منه.
Codelab | Python 2 | Python 3 |
الرمز (غير وارد في هذا الدليل التعليمي) | ||
الوحدة 12 (هذا الدرس التطبيقي حول الترميز) |
المراجع على الإنترنت
في ما يلي مراجع على الإنترنت قد تكون ذات صلة بهذا البرنامج التعليمي:
App Engine
- مستندات App Engine
- وقت تشغيل Python 2 App Engine (البيئة العادية)
- وقت تشغيل Python 3 App Engine (البيئة العادية)
- الاختلافات بين أوقات تشغيل Python 2 و3 في App Engine (البيئة العادية)
- دليل نقل البيانات من Python 2 إلى Python 3 في App Engine (البيئة العادية)
- معلومات الأسعار والحصص في App Engine
- إطلاق الجيل الثاني من منصة App Engine (2018)
- مقارنة بين الجيل الأول والثاني من المنصات
- الدعم الطويل الأمد لأوقات التشغيل القديمة
- مستودع نماذج نقل المستندات
- مستودع نماذج نقل البيانات التي ساهم بها المنتدى
Cloud Memorystore وCloud Datastore
- صفحة منتج Cloud Memorystore
- مستندات Cloud Memorystore for Redis
- مستندات Cloud Memorystore for Memcached
- معلومات أسعار Cloud Memorystore (for Redis)
- مستندات Cloud Datastore
- معلومات أسعار Cloud Datastore
معلومات أخرى حول السحابة الإلكترونية
- Python على Google Cloud Platform
- مكتبات برامج Python في Google Cloud
- فئة "دائمًا مجانية" في Google Cloud
- Google Cloud SDK (أداة سطر الأوامر
gcloud) - جميع مستندات Google Cloud
الفيديوهات
- Serverless Migration Station
- أداة "استكشافات" بدون خادم
- الاشتراك في قناة Google Cloud Tech
- الاشتراك في Google Developers
الترخيص
يخضع هذا العمل لترخيص المشاع الإبداعي مع نسب العمل إلى مؤلفه 2.0 Generic License.