استقرار یک برنامه وب Python Flask در محیط انعطاف پذیر App Engine

خلاصه

در این کد لبه یاد خواهید گرفت که چگونه یک برنامه وب Python Flask را در محیط انعطاف پذیر App Engine استقرار دهید. برنامه مثال به کاربر اجازه می دهد عکسی از چهره یک فرد آپلود کند و بفهمد که چقدر احتمال دارد که آن فرد خوشحال باشد. این برنامه از Google Cloud API برای 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 یک گزینه جایگزین برای زبان های خاصی از جمله پایتون است. App Engine Standard برنامه شما را در یک محیط جعبه ایمنی محدودتر اجرا می کند. برای اطلاعات بیشتر گزینه Choosing an App Engine Environment را بخوانید.

چیزی که یاد خواهید گرفت

  • نحوه استقرار یک برنامه وب ساده در App Engine Flexible Environment
  • نحوه دسترسی به کتابخانه های سرویس گیرنده Google Cloud برای Vision، Storage و Datastore
  • نحوه استفاده از Google Cloud Console و Google Cloud SDK برای مدیریت منابع مختلف ابری
  • نحوه استفاده از Cloud Shell

آنچه شما نیاز دارید

  • آشنایی با پایتون
  • آشنایی با ویرایشگرهای متن استاندارد لینوکس مانند Vim، Emacs یا Nano

ایجاد پروژه

اگر قبلاً یک حساب Google (Gmail یا Google Apps) ندارید، باید یک حساب ایجاد کنید . به کنسول Google Cloud Platform ( consol.cloud.google.com ) وارد شوید و یک پروژه جدید ایجاد کنید:

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID نامیده خواهد شد.

صورتحساب

در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورتحساب را در کنسول Cloud فعال کنید.

گذراندن از طریق این نرم افزار کد نباید بیش از چند دلار هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتری داشته باشید یا آنها را در حال اجرا رها کنید، ممکن است بیشتر باشد.

کاربران جدید Google Cloud Platform واجد شرایط استفاده آزمایشی رایگان 300 دلاری هستند.

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهیم کرد، یک محیط خط فرمان که در Cloud اجرا می شود. این ماشین مجازی مبتنی بر دبیان با تمام ابزارهای توسعه ای که نیاز دارید بارگذاری شده است ( gcloud ، python ، virtualenv ، pip و موارد دیگر)، یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد، و در Google Cloud اجرا می شود، و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. . این بدان معناست که تمام چیزی که برای این کد لبه نیاز دارید یک مرورگر است (بله، روی کروم بوک کار می کند).

برای فعال‌سازی 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/flex_and_vision تغییر دهید :

cd python-docs-samples/codelabs/flex_and_vision

قبل از شروع استفاده از Vision، Storage، و Datastore APIها، باید APIها را با دستورات زیر فعال کنید:

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

برای ارسال درخواست به APIهای Vision، Storage و Datastore، به اعتبار حساب سرویس نیاز دارید. اعتبار حساب سرویس از پروژه شما را می توان با استفاده از ابزار gcloud ایجاد کرد.

یک متغیر محیطی برای PROJECT_ID خود تنظیم کنید، و [ YOUR_PROJECT_ID ] را با ID پروژه خود جایگزین کنید:

export PROJECT_ID=[YOUR_PROJECT_ID]

برای دسترسی به APIهای Google Cloud هنگام آزمایش محلی، یک حساب سرویس ایجاد کنید:

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 بیشتر بخوانید.

راه اندازی محیط مجازی و نصب وابستگی ها

یک محیط ایزوله پایتون 3 به نام env با virtualenv ایجاد کنید:

virtualenv -p python3 env

virtualenv جدید خود را با نام env وارد کنید:

source env/bin/activate

از pip برای نصب وابستگی ها برای پروژه خود از فایل requires.txt استفاده کنید:

pip install -r requirements.txt

فایل requires.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

پس از شروع برنامه، روی نماد Web Preview کلیک کنیددر نوار ابزار Cloud Shell و "Preview on port 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

این فایل پایتون یک برنامه تحت وب Flask است. این برنامه به کاربران اجازه می دهد عکس هایی را ارسال کنند (ترجیحاً از چهره ها) که در Cloud Storage ذخیره شده و با استفاده از ویژگی تشخیص چهره Cloud Vision API تجزیه و تحلیل می شوند. اطلاعات کلیدی مربوط به هر عکس در Datastore، پایگاه داده NoSQL پلتفرم Google Cloud ذخیره می‌شود، جایی که هر بار که کاربر از وب‌سایت بازدید می‌کند به آن دسترسی پیدا می‌کند.

این برنامه از کتابخانه های سرویس گیرنده Google Cloud Platform برای Storage، Datastore و Vision استفاده می کند. این کتابخانه های سرویس گیرنده دسترسی به Cloud API را از زبان های برنامه نویسی مورد علاقه شما آسان می کند.

بیایید نگاهی به چند قطعه کلیدی از کد بیندازیم.

بخش واردات در بالا جایی است که ما بسته های مختلفی را که برای کد خود نیاز داریم وارد می کنیم. به این صورت است که ما کتابخانه های سرویس گیرنده Google Cloud خود را برای Datastore، Storage و Vision وارد می کنیم:

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

در اینجا کدی است که وقتی کاربر از URL ریشه وب سایت بازدید می کند چه اتفاقی می افتد. ما یک شی مشتری Datastore ایجاد می کنیم که برای دسترسی به کتابخانه مشتری Datastore استفاده می شود. سپس یک پرس و جو در Datastore برای موجودیت های چهره های مهربان اجرا می کنیم. در نهایت، قالب 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 بیاندازیم. Datastore راه حل پایگاه داده NoSQL Google Cloud است. داده ها در اشیایی به نام موجودیت ذخیره می شوند. به هر موجودیت یک کلید شناسایی منحصربفرد اختصاص داده می شود که می تواند با استفاده از یک نوع و یک رشته نام کلید ایجاد شود. نوع یک سطل سازمانی برای نوع موجودیت است. برای مثال، ممکن است بخواهیم انواعی را برای Photos، People و Animals تنظیم کنیم.

هر موجودیت می‌تواند چندین ویژگی تعریف‌شده توسط توسعه‌دهنده داشته باشد، که می‌تواند مقادیری از انواع مختلفی از جمله اعداد صحیح، شناورها، رشته‌ها، تاریخ‌ها یا داده‌های باینری داشته باشد.

    # 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)

به کتابخانه های سرویس گیرنده Storage و Vision می توان به صورت برنامه نویسی به روشی مشابه Datastore دسترسی داشت. می‌توانید فایل main.py را خودتان با استفاده از vim ، emacs یا nano باز کنید تا تمام کدهای نمونه را بررسی کنید.

در http://flask.pocoo.org/ درباره Flask بیشتر بیاموزید.

در https://googlecloudplatform.github.io/google-cloud-python/ درباره کتابخانه های مشتری بیشتر بیاموزید.

صفحه اصلی.html

چارچوب وب Flask از Jinja2 به عنوان موتور قالب استفاده می کند. این به ما امکان می دهد متغیرها و عباراتی را از main.py به homepage.html منتقل کنیم که پس از رندر شدن صفحه با مقادیر جایگزین می شوند.

درباره Jinja2 در http://jinja.pocoo.org/docs/2.9/templates/ بیشتر بیاموزید.

این قالب HTML Jinja2 فرمی را برای کاربران نمایش می دهد تا عکس ها را به پایگاه داده ارسال کنند. همچنین هر تصویر ارسال شده قبلی را همراه با نام فایل، تاریخ/زمان آپلود و احتمال خوشحال بودن چهره شناسایی شده توسط Vision API نمایش می دهد.

صفحه اصلی.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 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 خود را فراموش کردید، شناسه پروژه GCP را از Qwiklabs کپی کنید که همان). بخش env_variables متغیرهای محیطی را تنظیم می کند که پس از استقرار برنامه در main.py استفاده می شود.

اکنون می توانید ذخیره را ببندید و با استفاده از ( Ctrl + x ) فایل را به صورت nano ببندید، که از شما خواسته می شود:

اسکرین شات 17/02/2017 در ساعت 4.47.12 بعد از ظهر.png

یک حرف y را تایپ کنید و سپس کلید ENTER را یک بار دیگر فشار دهید تا نام فایل برای دستور زیر تایید شود:

اسکرین شات 24/02/2017 در ساعت 4.18.23 بعد از ظهر.png

با استفاده از gcloud ، برنامه خود را در App Engine اجرا کنید:

gcloud app deploy

پس از استقرار برنامه، می توانید با باز کردن URL https://< PROJECT_ID >.appspot.com در مرورگر وب خود، از آن بازدید کنید.

خلاصه

در این مرحله، یک برنامه تحت وب پایتون را راه اندازی کرده و آن را در محیط App Engine Flexible مستقر می کنید.

شما یاد گرفتید که چگونه اولین برنامه وب نرم افزار App Engine Flexible خود را بنویسید و اجرا کنید!

پاک کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud Platform برای منابع استفاده شده در این شروع سریع:

  • به کنسول Cloud Platform بروید.
  • پروژه ای را که می خواهید تعطیل کنید انتخاب کنید، سپس روی "حذف" در بالا کلیک کنید: با این کار، پروژه برای حذف برنامه ریزی می شود.

بیشتر بدانید

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.