ماژول 1: از App Engine webapp2 به Flask مهاجرت کنید

۱. مرور کلی

این مجموعه از آزمایشگاه‌های کد (آموزش‌های عملی و خودآموز) با هدف کمک به توسعه‌دهندگان Google App Engine (استاندارد) برای مدرن‌سازی برنامه‌هایشان با راهنمایی آنها در طی یک سری مهاجرت‌ها ارائه شده است. مهم‌ترین گام، فاصله گرفتن از سرویس‌های همراه زمان اجرا (runtime bundled) اصلی است، زیرا زمان‌های اجرای نسل بعدی انعطاف‌پذیرتر هستند و گزینه‌های خدماتی متنوع‌تری را در اختیار کاربران قرار می‌دهند. انتقال به زمان اجرا (runtime) نسل جدیدتر به شما این امکان را می‌دهد که راحت‌تر با محصولات Google Cloud ادغام شوید، از طیف وسیع‌تری از سرویس‌های پشتیبانی‌شده استفاده کنید و از نسخه‌های فعلی زبان‌ها پشتیبانی کنید.

این آموزش اولیه، اولین مراحل مهاجرت برای مدرن‌سازی چارچوب وب در برنامه‌های App Engine را نشان می‌دهد: انتقال از webapp2 به Flask . در برنامه خود، می‌توانید از هر چارچوب وب که مسیریابی را مدیریت می‌کند استفاده کنید، اما برای این آموزش، ما از Flask استفاده می‌کنیم زیرا به طور گسترده توسط جامعه استفاده می‌شود.

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

  • از کتابخانه‌های شخص ثالث (داخلی یا غیر از آن) استفاده کنید
  • به‌روزرسانی فایل‌های پیکربندی
  • انتقال یک برنامه ساده از webapp2 به Flask

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

نظرسنجی

چگونه از این آزمایشگاه کد استفاده خواهید کرد؟

فقط آن را بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

۲. پیشینه

چارچوب webapp زمانی که App Engine برای اولین بار در سال ۲۰۰۸ روی پایتون ۲.۵ منتشر شد، به صورت بسته ارائه شد. سال‌ها بعد، زمانی که در سال ۲۰۱۳، زمان اجرای ۲.۷، نسخه ۲.۵ را منسوخ کرد، webapp2 جایگزین آن شد.

اگرچه webapp2 (به اسناد مراجعه کنید) هنوز وجود دارد و می‌تواند به عنوان یک چارچوب وب سازگار با WSGI خارج از App Engine مورد استفاده قرار گیرد، اما مسیریابی درخواست‌های کاربر به کد مناسب در برنامه را خودش انجام نمی‌دهد. در عوض، برای انجام مسیریابی ترافیک وب به "handlers" مربوطه، به App Engine، فایل‌های پیکربندی و توسعه‌دهنده متکی است. علاوه بر این، مزایای اصلی webapp2 به طور جدایی‌ناپذیری به سرویس‌های همراه App Engine گره خورده است و حتی با وجود اینکه روی پایتون ۳ کار می‌کند ، عملاً آن را منسوخ می‌کند (همچنین به شماره مرتبط مراجعه کنید).

این ماژول به متخصصان تجربه عملی برای مهاجرت یک برنامه ساده webapp2 به Flask، چارچوبی که توسط App Engine و بسیاری از سرویس‌های دیگر خارج از Google Cloud پشتیبانی می‌شود، می‌دهد و برنامه‌ها را بسیار قابل حمل‌تر می‌کند. اگر Flask چارچوب مورد نظر برای انتقال برنامه شما نیست، می‌توانید چارچوب دیگری را انتخاب کنید، مشروط بر اینکه مسیریابی خود را انجام دهد. این آزمایشگاه کد، مراحل مهاجرت را به تصمیم‌گیرندگان فناوری اطلاعات (ITDM) و توسعه‌دهندگان نشان می‌دهد، بنابراین می‌توانید صرف نظر از اینکه واقعاً به کدام چارچوب مهاجرت می‌کنید، با این فرآیند آشنا شوید.

مراحل اولیه این مهاجرت به شرح زیر است:

  1. راه‌اندازی/پیش‌پردازش
  2. کتابخانه شخص ثالث Flask را اضافه کنید
  3. به‌روزرسانی فایل‌های برنامه
  4. به‌روزرسانی فایل قالب HTML

۳. تنظیمات/پیش‌پردازش

قبل از اینکه به بخش اصلی آموزش بپردازیم، بیایید پروژه خود را راه‌اندازی کنیم، کد را دریافت کنیم، سپس شما را با دستور gcloud (دوباره) آشنا کنیم و برنامه پایه را مستقر کنیم تا بدانیم که با کد کار شروع کرده‌ایم.

۱. پروژه راه‌اندازی

به عنوان یک توسعه‌دهنده‌ی فعلی، داشبورد App Engine شما احتمالاً از قبل سرویس‌هایی را که اجرا می‌کنید نشان می‌دهد. برای اهداف این آموزش، توصیه می‌کنیم یک پروژه کاملاً جدید ایجاد کنید یا از یک پروژه موجود برای این آموزش استفاده مجدد کنید. مطمئن شوید که پروژه دارای یک حساب پرداخت فعال است و App Engine (برنامه) فعال است.

۲. برنامه نمونه پایه را دانلود کنید

مخزن مهاجرت GAE تمام کد مورد نیاز شما را دارد. آن را کلون کنید یا فایل ZIP آن را دانلود کنید. برای این آموزش، با کد موجود در پوشه Module 0 (START) شروع خواهید کرد و پس از اتمام آموزش، کد شما باید با پوشه Module 1 (FINISH) مطابقت داشته باشد. در غیر این صورت، تفاوت‌ها را بررسی کنید تا بتوانید به تمرین بعدی بروید.

پوشه Module 0 باید فایل‌هایی شبیه به این داشته باشد، همانطور که با دستور POSIX ls نشان داده شده است:

$ ls
app.yaml        index.html      main.py

۳. با دستورات gcloud دوباره آشنا شوید

اگر هنوز دستور gcloud را روی دستگاه خود ندارید، Google Cloud SDK را نصب کنید و مطمئن شوید که gcloud به عنوان بخشی از مسیر اجرای شما در دسترس است و با دستورات gcloud زیر آشنا شوید:

  1. gcloud components update — به‌روزرسانی Google Cloud SDK
  2. gcloud auth login — به حساب کاربری معتبر خود وارد شوید
  3. gcloud config list — فهرست تنظیمات پیکربندی پروژه GCP
  4. gcloud config set project PROJECT_ID - شناسه پروژه GCP را تنظیم می‌کند
  5. gcloud app deploy - برنامه App Engine خود را مستقر کنید

اگر اخیراً توسعه App Engine را با gcloud انجام نداده‌اید، باید چهار دستور اول (#1-#4) را برای راه‌اندازی قبل از رفتن به مراحل بعدی اجرا کنید. بیایید یک مرور سریع از این دستورات انجام دهیم.

در مرحله اول، gcloud components update تضمین می‌کند که شما آخرین نسخه Cloud 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].

اگر ترجیح می‌دهید از کنسول ابری استفاده کنید، می‌توانید در صورت تمایل، رابط کاربری را دنبال کنید تا یک پروژه جدید ایجاد کنید یا از هر پروژه از پیش موجود دیگری که دارید استفاده کنید. در داشبورد پروژه خود، باید کارت اطلاعات پروژه را ببینید که شناسه آن (همراه با نام و شماره پروژه) را نشان می‌دهد:

کارت اطلاعات پروژه

آخرین دستور (شماره ۵)، gcloud app deploy ، برای استقرار برنامه شما در App Engine است. از آنجایی که ما تازه شروع کرده‌ایم، اجرای آن اختیاری است، اما مطمئناً از استقرار کد Module 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 در مستندات درخواست‌ها و مسیریابی موجود است .

پس از استقرار برنامه، مرورگر را (احتمالاً چند بار) رفرش کنید تا آخرین بازدیدها را ببینید:

اپلیکیشن ویزیت می

اگر برنامه شما جدید است، فقط یک یا چند بازدید مشاهده خواهید کرد.

۴. کتابخانه شخص ثالث Flask را اضافه کنید

موتور اجرای برنامه پایتون ۲ مجموعه‌ای از کتابخانه‌های شخص ثالث «توکار» را ارائه می‌دهد که تنها کاری که باید انجام دهید این است که آنها را در فایل app.yaml خود برای استفاده مشخص کنید. اگرچه این مهاجرت نیازی به استفاده از آنها ندارد، اما در آموزش مهاجرت بعدی (برای ماژول ۲) به آنها خواهیم پرداخت.

کتابخانه‌های شخص ثالث که داخلی نیستند ، باید در فایلی به نام requirements.txt مشخص شوند و به صورت محلی در پوشه lib در همان دایرکتوری که کد برنامه در آن آپلود شده است، نصب شوند. مستندات مربوط به بسته‌بندی کتابخانه‌های شخص ثالث اطلاعات بیشتری دارد.

کتابخانه‌های کپی‌شده مانند Flask نیاز دارند که شما به App Engine بگویید که با استفاده از فایل پیکربندی appengine_config.py ، آنها را در پوشه lib جستجو کند. فایل پیکربندی appengine_config.py در همان پوشه برنامه سطح بالا مانند requirements.txt و lib قرار دارد. در این بخش از آموزش، شما:

  • requirements.txt را ایجاد کنید (کتابخانه‌های شخص ثالث کپی‌شده [غیر توکار] را مشخص کنید)
  • ایجاد appengine_config.py (شناسایی کتابخانه‌های شخص ثالث)
  • نصب بسته‌ها و وابستگی‌های (شخص ثالث)

۱. requirements.txt را ایجاد کنید.

یک فایل requirements.txt برای مشخص کردن بسته‌های خود ایجاد کنید. در مورد ما، Flask کتابخانه شخص ثالث مورد نیاز است. در زمان نوشتن این مطلب، آخرین نسخه ۱.۱.۲ است، بنابراین requirements.txt با این یک خط ایجاد کنید:

Flask==1.1.2

برای کسب اطلاعات بیشتر در مورد فرمت‌های پذیرفته شده، به مستندات requirements.txt مراجعه کنید.

۲. 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 مربوط به کتابخانه‌های کپی‌شده هدایت می‌کند.

۳. نصب بسته(ها) و وابستگی‌ها

حالا دستور 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/

۵. به‌روزرسانی فایل‌های برنامه

حالا بیایید فایل برنامه، main.py را به‌روزرسانی کنیم.

۱. واردات

همانند تمام فایل‌های پایتون، ایمپورت‌ها ابتدا می‌آیند. پس از ایمپورت فریم‌ورک webapp2 ، کتابخانه ndb Datastore و در نهایت، افزونه App Engine که قالب‌های جنگو را پردازش می‌کند، قرار دارد. باید تصویر زیر را ببینید:

  • قبل از:
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

۲. استارتاپ

برنامه‌هایی که از webapp2 استفاده می‌کنند به یک آرایه واحد (لیست پایتون) نیاز دارند که تمام مسیرها و هندلرها را در هر فایل پایتون فهرست می‌کند (ممکن است فایل‌های دیگری نیز وجود داشته باشد):

  • قبل از:
app = webapp2.WSGIApplication([
    ('/', MainHandler),
], debug=True)

به خاطر داشته باشید که app.yaml مسیریابی سطح بالاتری را انجام می‌دهد و ممکن است هندلرهای مختلفی را فراخوانی کند. برنامه نمونه به اندازه کافی ساده است که همه مسیرها به هندلر main.py می‌رسند.

فلسک از جداول مسیریابی مانند این استفاده نمی‌کند، بنابراین این خطوط را در main.py حذف کنید. فلسک همچنین نیاز به مقداردهی اولیه دارد، بنابراین خط زیر را در بالای main.py درست زیر importها اضافه کنید:

  • بعد از:
app = Flask(__name__)

در فلسک، شما چارچوب را مقداردهی اولیه می‌کنید و سپس از دکوراتورها برای تعریف مسیرها استفاده می‌کنید. همچنین، مسیرها با توابع جفت می‌شوند، نه کلاس‌ها یا متدها.

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

۳. مدل داده

اینجا هیچ تغییری ایجاد نشده است. تمرکز آزمایشگاه کد بعدی روی Datastore خواهد بود.

۴. گردانندگان

این برنامه، صرف نظر از اینکه از کدام چارچوب ( webapp2 یا Flask) استفاده می‌کنید، سه کار انجام می‌دهد:

  1. مدیریت درخواست‌های GET با مسیر ریشه ( / )
  2. ثبت یک صفحه وب با عنوان "بازدید" (ایجاد/ذخیره شیء Visit )
  3. نمایش ۱۰ بازدید اخیر برتر (با یک الگوی از پیش تعریف شده، 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}))

همانطور که در بالا ذکر شد، فلسک مسیریابی خود را انجام می‌دهد. به جای یک کلاس کنترل‌کننده، شما توابع را می‌نویسید و آنها را با مسیری که باید برای آن فراخوانی شوند، تزئین می‌کنید. کاربران می‌توانند متدهای 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 مقایسه کنید.

۵. فایل‌های کمکی

هیچ تغییری در فایل .gcloudignore ایجاد نشده است. هدف آن مشخص کردن فایل‌هایی است که برای استقرار و اجرای برنامه ضروری نیستند و در App Engine مستقر نمی‌شوند ، از جمله فایل‌های کمکی پایتون، کنترل منبع، فایل boilerplate مخزن و سایر فایل‌ها. .gcloudignore ما به این شکل است (با حذف کامنت‌ها برای اختصار):

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

۶. فایل قالب HTML را به‌روزرسانی کنید

۱. فایل الگو را منتقل کنید

در پوشه مخزن پایه (ماژول 0)، فایل الگوی index.html در همان پوشه‌ای است که فایل‌های برنامه قرار دارند. از آنجایی که Flask به فایل‌های HTML قرار گرفته در پوشه templates نیاز دارد، باید آن پوشه ( mkdir templates ) را ایجاد کنید و index.html را به آنجا منتقل کنید. در یک سیستم سازگار با POSIX مانند لینوکس یا Mac OS X، دستورات به صورت زیر خواهند بود:

mkdir templates
mv index.html templates

۲. فایل الگو را به‌روزرسانی کنید

وقتی 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 از قالب‌های جنگو استفاده می‌کند که فراخوانی‌هایی مانند visit.timestamp.ctime را بدون پرانتز ( ) اجرا می‌کنند، Jinja2 صراحتاً آنها را الزامی می‌داند. اگرچه این یک تغییر جزئی به نظر می‌رسد، قالب‌های Jinja از همان ابتدا قدرتمندتر هستند زیرا می‌توانید آرگومان‌ها را در فراخوانی‌ها ارسال کنید.

در جنگو، یا باید یک "تگ قالب" ایجاد کنید یا یک فیلتر بنویسید. با این درک، index.html را با اضافه کردن یک جفت پرانتز به فراخوانی visit.timestamp.ctime به‌روزرسانی کنید:

  • قبل از:
<li>{{ visit.timestamp.ctime }} from {{ visit.visitor }}</li>
  • بعد از:
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>

این تنها تغییر مورد نیاز است؛ هیچ تغییر اضافی در index.html برای سایر آزمایشگاه‌های کد مهاجرت باقی‌مانده لازم نیست.

۷. خلاصه/پاکسازی

استقرار برنامه

وقتی تمام تغییرات این آموزش را انجام دادید، فایل‌های موجود در پوشه برنامه شما باید با فایل موجود در پوشه مخزن Module 1 یکسان (یا تقریباً یکسان) باشند. اکنون آن را مستقر کنید و ببینید که برنامه ماژول 1 Flask شما دقیقاً مشابه نسخه ماژول 0 webapp2 اجرا می‌شود.

همانطور که قبلاً هنگام استقرار کد ماژول 0 اصلی انجام دادیم، از دستور gcloud app deploy استفاده کنید. برای تأیید عملکرد صحیح برنامه، از طریق مرورگر وب یا دستور curl یا wget به PROJECT_ID.appspot.com به برنامه دسترسی پیدا کنید.

اگر با نوعی خطای سرور مواجه شدید، معمولاً به معنای نوعی اشتباه تایپی در کد پایتون شماست. برای بررسی، نگاهی به لاگ‌های برنامه خود بیندازید. همچنین فایل‌های خود را با فایل‌های موجود در مخزن ماژول ۱ (لینک بالا) مقایسه کنید.

اختیاری: تمیز کردن

در مورد پاکسازی برای جلوگیری از پرداخت هزینه تا زمانی که آماده انتقال به آزمایشگاه کد مهاجرت بعدی باشید، چطور؟ به عنوان توسعه‌دهندگان فعلی، احتمالاً از قبل از اطلاعات قیمت‌گذاری App Engine مطلع هستید.

اختیاری: غیرفعال کردن برنامه

اگر هنوز آماده رفتن به آموزش بعدی نیستید، برنامه خود را غیرفعال کنید تا از پرداخت هزینه جلوگیری شود. وقتی آماده رفتن به آزمایشگاه کد بعدی شدید، می‌توانید دوباره آن را فعال کنید. در حالی که برنامه شما غیرفعال است، هیچ ترافیکی دریافت نمی‌کند که هزینه‌ای داشته باشد، با این حال مورد دیگری که ممکن است برای آن هزینه دریافت کنید، استفاده از Datastore شما در صورت تجاوز از سهمیه رایگان است، بنابراین به اندازه‌ای حذف کنید که زیر آن محدودیت قرار گیرد.

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

مراحل بعدی

دو ماژول مهاجرت وجود دارد که با کد تکمیل‌شده ماژول ۱ شروع می‌شوند، ماژول‌های ۲ و ۷:

  • ماژول ۲ (در صورت استفاده از Datastore الزامی است)
    • مهاجرت از App Engine ndb به Cloud NDB
    • پس از تغییر به Cloud NDB، گزینه‌های بسیار دیگری نیز در دسترس قرار می‌گیرند.
      • کانتینرسازی برنامه برای اجرا در Cloud Run
      • انتقال بیشتر برنامه شما به کتابخانه کلاینت Cloud Datastore
      • انتقال برنامه به Cloud Firestore برای دسترسی به ویژگی‌های Firebase
  • ماژول ۷ (در صورت استفاده از صف‌های وظیفه [push] الزامی است)
    • افزودن میزان استفاده taskqueue موتور برنامه (push)
    • آماده‌سازی برنامه ماژول ۱ برای مهاجرت به وظایف ابری در ماژول ۸

۸. منابع اضافی

مشکلات/بازخورد ماژول مهاجرت موتور برنامه در codelabs

اگر در این آزمایشگاه کد مشکلی پیدا کردید، لطفاً قبل از ثبت، ابتدا مشکل خود را جستجو کنید. لینک‌های جستجو و ایجاد مشکلات جدید:

منابع مهاجرت

لینک‌های پوشه‌های مخزن ماژول ۰ (شروع) و ماژول ۱ (پایان) را می‌توانید در جدول زیر پیدا کنید. همچنین می‌توانید از مخزن مربوط به همه مهاجرت‌های App Engine که می‌توانید آن‌ها را کلون کنید یا یک فایل ZIP دانلود کنید، به آن‌ها دسترسی داشته باشید.

کدلب

پایتون ۲

پایتون ۳

ماژول 0

کد

(نامشخص)

ماژول ۱

کد

(نامشخص)

منابع موتور برنامه

در زیر منابع بیشتری در مورد این مهاجرت خاص آمده است: