نشر تطبيق ويب Python Flask على بيئة بيئة App Engine المرنة

الملخّص

في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية نشر تطبيق ويب Python Flask على بيئة App Engine المرنة. يتيح نموذج التطبيق للمستخدم تحميل صورة وجه شخص ومعرفة مدى احتمال إرضاء هذا الشخص. يستخدم التطبيق Google Cloud APIs لخدمات Vision وStorage وDatastore.

لمحة عن App Engine

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

يتم تغيير تطبيقات App Engine تلقائيًا استنادًا إلى الزيارات الواردة. موازنة الحمل، والخدمات الدقيقة، والتفويض، وقواعد بيانات SQL وNoSQL، وتقسيم الزيارات، والتسجيل، والبحث، وتحديد الإصدارات، والطرح والعودة إلى النسخ الاحتياطي، وفحص الأمان جميعها متاحة محليًا وقابلة للتخصيص بشكلٍ كبير.

تتوافق البيئة المرنة مع App Engine في جميع لغات البرمجة التالية: C# وGo وJava وNode.js وPHP وPython وRuby. يشغّل App Engine Flexible تطبيقك ضمن حاويات docker التي تعمل على الأجهزة الافتراضية من Google Compute Engine. إنّ البيئة العادية لـ App Engine هي خيار بديل للغات معيّنة بما في ذلك Python. يشغّل App Engine Standard تطبيقك في بيئة وضع الحماية الأكثر تقييدًا. اقرأ اختيار بيئة App Engine للحصول على مزيد من المعلومات.

ما ستتعرّف عليه

  • كيفية نشر تطبيق ويب بسيط إلى بيئة بيئة App Engine المرنة
  • كيفية الوصول إلى مكتبات عملاء Google Cloud لـ Vision وStorage وDatastore
  • كيفية استخدام Google Cloud Console وحزمة تطوير برامج Google Cloud لإدارة موارد السحابة الإلكترونية المختلفة
  • كيفية استخدام Cloud Shell

المتطلبات اللازمة

  • الدراية بـ Python
  • الإلمام بأدوات تحرير نصوص Linux العادية مثل Vim أو Emacs أو Nano

إنشاء المشروع

إذا لم يكن لديك حساب على Google (Gmail أو Google Apps)، يجب إنشاء حساب. تسجيل الدخول إلى وحدة تحكُّم Google Cloud Platform (console.cloud.google.com) وإنشاء مشروع جديد:

عذرًا! وستتم الإشارة إليه لاحقًا في هذا الدرس التطبيقي حول الترميز PROJECT_ID.

الفوترة

بعد ذلك، ستحتاج إلى تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

من المفترَض ألا يكلفك تنفيذ هذا الدرس التطبيقي أكثر من بضعة دولارات، ولكن قد يكلف ذلك أكثر إذا قررت استخدام المزيد من الموارد أو إذا تركتها قيد التشغيل.

يكون المستخدمون الجدد لخدمة Google Cloud Platform مؤهَّلين للاستفادة من فترة تجريبية مجانية تبلغ 300 دولار أمريكي.

علمًا أنه يمكن تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، فإننا في هذا الدرس التطبيقي سنستخدم Google Cloud Shell، وهو بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية. ويتم تحميل هذا الجهاز الافتراضي الذي يعمل بنظام التشغيل Debian بكل أدوات التطوير التي ستحتاج إليها (gcloud وpython وVirtualenv وpip وغيرها)، كما يقدم دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله على Google Cloud، ما يعزِّز بشكل كبير أداء الشبكة والمصادقة. ويعني ذلك أنّ كل ما ستحتاج إليه في هذا الدرس التطبيقي هو متصفّح (نعم، يعمل على جهاز Chromebook).

لتفعيل Google Cloud Shell، من وحدة تحكّم مطوّري البرامج، انقر على الزر في أعلى يسار الصفحة (من المفترض أن تستغرق إدارة الحسابات والاتصال بضع لحظات فقط):

بعد الاتصال بواجهة السحابة الإلكترونية، من المفترض أن ترى أنه قد تمت المصادقة عليك وأن المشروع قد سبق وتم إعداده على PROJECT_ID:

gcloud auth list
Credentialed accounts:
- <myaccount>@<mydomain>.com (active)
gcloud config list project
[core]
Project = <PROJECT_ID>

إذا لم يتم إعداد المشروع لسبب ما، عليك إصدار الأمر التالي:

gcloud config set project <PROJECT_ID>

هل تبحث عن PROJECT_ID؟ تحقق من رقم تعريف المشروع الذي استخدمته في خطوات الإعداد أو ابحث عنه في لوحة بيانات وحدة التحكم:

في Cloud Shell على سطر الأوامر، شغِّل الأمر التالي في إنشاء نسخة طبق الأصل من مستودع Github:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

غيِّر الدليل إلى python-docs-samples/codelabs/cursor_and_vision:

cd python-docs-samples/codelabs/flex_and_vision

قبل أن نتمكن من بدء استخدام واجهات برمجة التطبيقات Vision وStorage وDatastore، يجب تفعيل واجهات برمجة التطبيقات من خلال الأوامر التالية:

gcloud services enable vision.googleapis.com
gcloud services enable storage-component.googleapis.com
gcloud services enable datastore.googleapis.com

لإنشاء طلبات إلى واجهات برمجة التطبيقات Vision وStorage وDatastore، ستحتاج إلى بيانات اعتماد حساب الخدمة. يمكن إنشاء بيانات اعتماد حساب الخدمة من مشروعك باستخدام أداة gcloud.

اضبط متغيّر بيئة للعنصر PROJECT_ID، مع استبدال [YOUR_PROJECT_ID] برقم تعريف مشروعك الخاص:

export PROJECT_ID=[YOUR_PROJECT_ID]

أنشئ حساب خدمة للوصول إلى Google Cloud APIs عند الاختبار محليًا:

gcloud iam service-accounts create codelab \
  --display-name "My Codelab Service Account"

امنح "حساب الخدمة" الذي تم إنشاؤه حديثًا الأذونات المناسبة:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:codelab@${PROJECT_ID}.iam.gserviceaccount.com \
--role roles/owner

بعد إنشاء حساب الخدمة، أنشِئ مفتاح حساب خدمة:

gcloud iam service-accounts keys create ~/key.json \
--iam-account codelab@${PROJECT_ID}.iam.gserviceaccount.com

يعمل هذا الأمر على إنشاء مفتاح لحساب خدمة مخزّن في ملف JSON باسم key.json في الدليل الرئيسي.

باستخدام المسار المطلق للمفتاح الذي تم إنشاؤه، اضبط متغيّر بيئة لمفتاح حساب الخدمة في Cloud Shell:

export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"

يمكنك قراءة المزيد عن مصادقة Vision API.

بدء البيئة الافتراضية واعتمادات التثبيت

أنشئ بيئة Python معزولة باسم env باستخدام Virtualenv:

virtualenv -p python3 env

أدخِل Virtualenv الذي تم إنشاؤه مؤخرًا باسم env:

source env/bin/activate

استخدِم pip لتثبيت تبعيات مشروعك من ملف requirements.txt:

pip install -r requirements.txt

ملف requirements.txt هو قائمة باعتماديات الحِزم التي تحتاجها لمشروعك. نزَّل الأمر أعلاه كل تبعيات الحزمة المدرجة هذه إلى Virtualenv.

إنشاء تطبيق App Engine

بعد ذلك، يمكنك إنشاء مثيل App Engine باستخدام:

gcloud app create

إنشاء حزمة تخزين

أولاً، عليك ضبط متغيِّر البيئة CLOUD_STORAGE_BUCKET على نفس اسم PROJECT_ID. (يُوصى عمومًا بتسمية الحزمة كما هو الحال مع PROJECT_ID للأغراض المناسبة).

export CLOUD_STORAGE_BUCKET=${PROJECT_ID}

يستخدم تطبيقنا حزمة Cloud Storage، وسيتعيّن عليك إنشاؤها من Cloud Shell باستخدام أداة تُسمى gsutil. شغِّل الأمر التالي الذي يؤدي إلى إنشاء حزمة تحمل الاسم نفسه كـ PROJECT_ID.

gsutil mb gs://${PROJECT_ID}

تشغيل التطبيق

python main.py

بعد بدء تشغيل التطبيق، انقر على رمز معاينة الويب في شريط أدوات Cloud Shell واختر &معاينة على المنفذ 8080."

يتم فتح علامة تبويب في المتصفِّح وتتصل بالخادم الذي بدأته للتو. ينبغي أن تظهر لك على النحو التالي:

لقطة شاشة يوم 23-02-2017 في الساعة 7.22.50 مساءً.png

حاول تحميل صورة تحتوي على وجه بشري. انقر على الزر اختيار ملف، واختر صورة من جهاز الكمبيوتر، ثم انقر على إرسال.

بعد تحميل صورة، ستظهر لك الصورة التالية:

لقطة شاشة يوم 23-02-2017 في الساعة 7.32.08 مساءً.png

نموذج رمز الرمز

يتضمن النموذج التنسيق التالي:

templates/
  homepage.html   /* HTML template that uses Jinja2 */
app.yaml          /* App Engine application configuration file */
main.py           /* Python Flask web application */
requirements.txt  /* List of dependencies for the project */

main.py

ملف Python هذا هو تطبيق ويب Flask. يسمح التطبيق للمستخدمين بإرسال الصور (يُفضّل أن تكون مُصنّفة حسب الوجوه) التي يتم تخزينها في Cloud Storage وتحليلها باستخدام ميزة "التعرّف على الوجوه" في Cloud Vision API. ويتم تخزين المعلومات الأساسية حول كل صورة في قاعدة بيانات NoSQL في Google Cloud Platform، ويمكن الوصول إليها في كل مرة يزور فيها المستخدم الموقع الإلكتروني.

يستخدم هذا التطبيق مكتبات برامج Google Cloud Platform لـ Storage وDatastore وVision. وتسهِّل مكتبات العملاء هذه الوصول إلى واجهات برمجة تطبيقات Cloud من لغات البرمجة المفضَّلة لديك.

لنلقِ نظرة على بعض مقتطفات الرمز الرئيسية.

قسم الاستيراد في الجزء العلوي هو المكان الذي نستورد فيه الحزم المختلفة التي نحتاج إليها لرمزنا. إليك كيفية استيراد مكتبات Google Cloud لتخزين البيانات والتخزين والرؤية:

from google.cloud import datastore
from google.cloud import storage
from google.cloud import vision

في ما يلي رمز لما يحدث عندما يزور أحد المستخدمين عنوان URL الجذر للموقع الإلكتروني. ننشئ كائن عميل Datastore، الذي يُستخدم للوصول إلى مكتبة برامج Datastore. بعد ذلك، نُجري طلبًا على Datastore لكيانات من النوع Faces. وأخيرًا، نعرض نموذج HTML، مع ضبط image_entities (رابط_الصورة) التي نستخرجها من Datastore كمتغيّر.

@app.route('/')
def homepage():
    # Create a Cloud Datastore client.
    datastore_client = datastore.Client()

    # Use the Cloud Datastore client to fetch information from Datastore about
    # each photo.
    query = datastore_client.query(kind='Faces')
    image_entities = list(query.fetch())

    # Return a Jinja2 HTML template and pass in image_entities as a parameter.
    return render_template('homepage.html', image_entities=image_entities)

لنلقِ نظرة على كيفية حفظ الكيانات في متجر البيانات. Datastore هو حل قاعدة بيانات NoSQL في Google Cloud's. ويتم تخزين البيانات في عناصر تُسمّى الكيانات. يتم تخصيص مفتاح فريد لكل كيان، ويمكن إنشاؤه باستخدام سلسلة النوع واسم المفتاح. النوع هو حزمة تنظيمية لنوع الكيان. على سبيل المثال، قد يلزم إعداد الأنواع الخاصة بالصور والأشخاص والحيوانات.

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

    # Create a Cloud Datastore client.
    datastore_client = datastore.Client()

    # Fetch the current date / time.
    current_datetime = datetime.now()

    # The kind for the new entity.
    kind = 'Faces'

    # The name/ID for the new entity.
    name = blob.name

    # Create the Cloud Datastore key for the new entity.
    key = datastore_client.key(kind, name)

    # Construct the new entity using the key. Set dictionary values for entity
    # keys blob_name, storage_public_url, timestamp, and joy.
    entity = datastore.Entity(key)
    entity['blob_name'] = blob.name
    entity['image_public_url'] = blob.public_url
    entity['timestamp'] = current_datetime
    entity['joy'] = face_joy

    # Save the new entity to Datastore.
    datastore_client.put(entity)

يمكن الوصول إلى مكتبات برامج "التخزين" و"الرؤية" آليًا بطريقة مماثلة للوصول إلى مكتبات البيانات. يمكنك فتح ملف main.py بنفسك باستخدام vim أو emacs أو nano لاستكشاف كل نماذج الرمز.

تعرّف على مزيد من المعلومات عن Flask على http://flask.pocoo.org/.

تعرَّف على المزيد من المعلومات عن مكتبات العملاء على الرابط https://googlecloudplatform.github.io/google-cloud-python/.

page.html

يستفيد إطار عمل Flask على الويب من Jinja2 كمحرِّر نموذج. ويسمح لنا ذلك بتمرير المتغيرات والتعبيرات من main.py إلى homepage.html التي يتم استبدالها بقيم بعد عرض الصفحة.

تعرف على مزيد من المعلومات حول Jinja2 على http://jinja.pocoo.org/docs/2.9/templates/.

يعرض نموذج HTML Jinja2 نموذجًا للمستخدمين لإرسال الصور إلى قاعدة البيانات. ويعرض أيضًا كل صورة سبق إرسالها مع اسم الملف وتاريخ التحميل ووقته واحتمال ظهور الوجه الذي اكتشفته واجهة برمجة التطبيقات Vision API.

homepage.html

<h1>Google Cloud Platform - Face Detection Sample</h1>

<p>This Python Flask application demonstrates App Engine Flexible, Google Cloud
Storage, Datastore, and the Cloud Vision API.</p>

<br>

<html>
  <body>
    <form action="upload_photo" method="POST" enctype="multipart/form-data">
      Upload File: <input type="file" name="file"><br>
      <input type="submit" name="submit" value="Submit">
    </form>
    
  </body>
</html>

يستخدم App Engine Flexible ملفًا باسم app.yaml لوصف إعداد نشر تطبيق. في حال عدم توفّر هذا الملف، سيحاول App Engine تخمين إعدادات النشر. ومع ذلك، يُستحسن تقديم هذا الملف.

بعد ذلك، ستعدّل app.yaml باستخدام محرِّر من اختيارك vim أو nano أو emacs. سنستخدم محرِّر nano:

nano app.yaml

app.yaml

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
    python_version: 3

env_variables:
    CLOUD_STORAGE_BUCKET: <your-cloud-storage-bucket>

هذه هي الإعدادات الأساسية اللازمة لنشر تطبيق Python 3 App Engine Flex. يمكنك التعرف على المزيد من المعلومات عن إعداد App Engine هنا.

بعد فتح app.yaml، استبدِل < your-cloud-storage-bucket > باسم حزمة Cloud Storage. (في حال نسيت اسم حزمة Cloud Storage، انسخ رقم تعريف مشروع Google Cloud Platform نفسه، وهو من Qwiklabs. يعمل قسم env_variables على إعداد متغيرات البيئة التي سيتم استخدامها في main.py بعد نشر التطبيق.

يمكنك الآن إغلاق الملف وإغلاقه في nano باستخدام (Ctrl + x)، والذي سيطالبك بما يلي:

لقطة شاشة يوم 2017-02-17 الساعة 4.47.12 مساءً.png

اكتب الحرف y ثم اضغط على المفتاح ENTER مرة أخرى لتأكيد اسم الملف لرسالة المطالبة التالية:

لقطة شاشة يوم 24-02-2017 في الساعة 4.18.23 مساءً.png

انشر تطبيقك على App Engine باستخدام gcloud:

gcloud app deploy

بعد نشر التطبيق، يمكنك الانتقال إليه عن طريق فتح عنوان URL https://< PROJECT_ID >.appspot.com في متصفح الويب.

الملخّص

في هذه الخطوة، يمكنك إعداد تطبيق ويب Python ونشره إلى بيئة App Engine المرنة.

لقد تعلّمت كيفية كتابة ونشر أول تطبيق ويب مرنة لـ App Engine!

تنظيف

لتجنّب تكبد رسوم في حساب Google Cloud Platform مقابل الموارد المستخدمة في دليل البدء السريع:

  • انتقِل إلى وحدة تحكُّم Cloud Platform.
  • اختَر المشروع الذي تريد إيقافه، ثم انقر على "حذف&#39؛ في أعلى الصفحة: يؤدي هذا إلى تحديد موعد لحذف المشروع.

مزيد من المعلومات

الترخيص

يخضع هذا العمل لترخيص بموجب رخصة المشاع الإبداعي مع نسب العمل إلى مؤلفه 2.0.