Mô-đun 1: Di chuyển từ webapp2 của App Engine sang Flask

1. Tổng quan

Loạt lớp học lập trình này (hướng dẫn thực hành theo tiến độ riêng) nhằm giúp các nhà phát triển Google App Engine (Tiêu chuẩn) hiện đại hoá ứng dụng của họ bằng cách hướng dẫn họ thực hiện một loạt quy trình di chuyển. Bước quan trọng nhất là ngừng sử dụng các dịch vụ thời gian chạy ban đầu đi kèm vì môi trường thời gian chạy thế hệ mới linh hoạt hơn, mang đến cho người dùng nhiều lựa chọn dịch vụ hơn. Khi chuyển sang môi trường thời gian chạy thế hệ mới hơn, bạn có thể tích hợp dễ dàng hơn với các sản phẩm của Google Cloud, sử dụng nhiều dịch vụ được hỗ trợ hơn và hỗ trợ các bản phát hành ngôn ngữ hiện tại.

Hướng dẫn ban đầu này trình bày các bước di chuyển đầu tiên để hiện đại hoá khung web trong ứng dụng App Engine: di chuyển từ webapp2 sang Flask. Trong ứng dụng của mình, bạn có thể sử dụng bất kỳ khung web nào có chức năng định tuyến. Tuy nhiên, trong hướng dẫn này, chúng ta sử dụng Flask vì bình luận này được cộng đồng sử dụng rộng rãi.

Bạn sẽ tìm hiểu cách

  • Sử dụng thư viện của bên thứ ba (tích hợp sẵn hoặc thư viện khác)
  • Cập nhật tệp cấu hình
  • Di chuyển một ứng dụng đơn giản từ webapp2 sang Flask

Bạn cần có

Khảo sát

Bạn sẽ sử dụng lớp học lập trình này như thế nào?

Chỉ đọc qua Đọc và hoàn thành bài tập

2. Thông tin khái quát

Khung webapp được đi kèm khi App Engine lần đầu ra mắt trên Python 2.5 vào năm 2008. Nhiều năm sau đó, phiên bản này được thay thế bằng phiên bản kế nhiệm webapp2 khi thời gian chạy 2.7 ngừng sử dụng 2.5 vào năm 2013.

Mặc dù webapp2 (xem tài liệu) vẫn tồn tại và có thể được sử dụng bên ngoài App Engine dưới dạng một khung web tuân thủ WSGI, nhưng lớp này không định tuyến riêng các yêu cầu của người dùng đến mã thích hợp trong ứng dụng. Thay vào đó, ứng dụng dựa vào App Engine, tệp cấu hình và nhà phát triển để định tuyến lưu lượng truy cập web đến các "trình xử lý" tương ứng. Hơn nữa, các lợi ích cốt lõi của webapp2 gắn liền với các dịch vụ đi kèm của App Engine, nên sẽ không dùng được dịch vụ này nữa mặc dù hoạt động trên Python 3 (xem thêm vấn đề liên quan).

Mô-đun này mang đến cho các chuyên viên trải nghiệm thực tế về cách di chuyển một ứng dụng webapp2 đơn giản sang Flask, một khung được App Engine và nhiều dịch vụ khác hỗ trợ bên ngoài Google Cloud, giúp ứng dụng dễ di chuyển hơn. Nếu Flask không phải là khung mong muốn để di chuyển ứng dụng của bạn sang, bạn có thể chọn một khung khác miễn là nó tự định tuyến. Lớp học lập trình này cung cấp thông tin về các bước di chuyển cho những người ra quyết định trong lĩnh vực công nghệ thông tin (ITDM) và nhà phát triển. Nhờ đó, bạn có thể làm quen với quy trình này bất kể bạn thực sự di chuyển sang khung nào.

Dưới đây là các bước chính cho quá trình di chuyển này:

  1. Thiết lập/Chuẩn bị
  2. Thêm thư viện bên thứ ba của Flask
  3. Cập nhật tệp ứng dụng
  4. Cập nhật tệp mẫu HTML

3. Thiết lập/Chuẩn bị

Trước khi bắt đầu phần chính của hướng dẫn này, hãy thiết lập dự án, lấy mã, sau đó làm quen (lại) với lệnh gcloud và triển khai ứng dụng cơ sở để biết rằng chúng ta đã bắt đầu làm việc với mã.

1. Thiết lập dự án

Nếu bạn là nhà phát triển hiện tại, có thể trang tổng quan App Engine của bạn sẽ hiện những dịch vụ mà bạn đang chạy. Vì mục đích của hướng dẫn này, bạn nên tạo một dự án hoàn toàn mới hoặc sử dụng lại một dự án hiện có cho hướng dẫn này. Hãy đảm bảo dự án này có một tài khoản thanh toán đang hoạt động và đã bật App Engine (ứng dụng).

2. Tải ứng dụng mẫu cơ sở xuống

Kho lưu trữ di chuyển GAE có tất cả các mã mà bạn cần. Sao chép tệp đó hoặc tải tệp ZIP xuống. Đối với hướng dẫn này, bạn sẽ bắt đầu với đoạn mã trong thư mục Mô-đun 0 (START), và khi bạn đã hoàn thành phần hướng dẫn, đoạn mã của bạn phải khớp với thư mục Mô-đun 1 (KẾT THÚC). Nếu không, hãy tìm hiểu những điểm khác biệt để bạn có thể chuyển sang phòng thí nghiệm tiếp theo.

Thư mục Mô-đun 0 phải có các tệp như sau, như minh hoạ bằng lệnh ls POSIX:

$ ls
app.yaml        index.html      main.py

3. (V/v) Làm quen với các lệnh gcloud

Nếu bạn chưa có lệnh gcloud trên máy, hãy cài đặt Google Cloud SDK và đảm bảo gcloud có sẵn trong đường dẫn thực thi của bạn, đồng thời làm quen với các lệnh gcloud sau:

  1. gcloud components update — cập nhật Google Cloud SDK
  2. gcloud auth login — đăng nhập vào tài khoản đã xác thực của bạn
  3. gcloud config list – liệt kê các chế độ cài đặt cấu hình dự án GCP
  4. gcloud config set project PROJECT_ID — đặt mã dự án GCP
  5. gcloud app deploy — triển khai ứng dụng App Engine

Nếu gần đây chưa phát triển App Engine bằng gcloud, bạn nên chạy 4 lệnh đầu tiên (#1 – #4) để thiết lập trước khi chuyển sang các bước tiếp theo. Hãy cùng xem tổng quan nhanh về những lệnh này.

Trước tiên, gcloud components update đảm bảo bạn dùng phiên bản Cloud SDK mới nhất. Việc chạy lệnh này sẽ cho ra kết quả như sau:

$ 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

Tiếp theo, hãy sử dụng gcloud auth login để xác thực bản thân cho các lệnh gcloud mà bạn sẽ đưa ra từ nay về sau:

$ 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

Sử dụng gcloud config list để xem các chế độ cài đặt hiện tại cho dự án của bạn:

$ gcloud config list
[core]
account = YOUR_EMAIL
disable_usage_reporting = False
project = PROJECT_ID

Your active configuration is: [default]

Lệnh ở trên sẽ hướng dẫn bạn tạo dự án mới hoặc chọn dự án hiện có. Nếu kết quả của gcloud config list không khớp với dự án đã chọn mà bạn định sử dụng cho hướng dẫn này, hãy chạy gcloud config set project PROJECT_ID để đặt mã dự án. Sau đó, hãy xác nhận đã đặt đúng mã dự án bằng cách chạy lại gcloud config list.

$ gcloud config set project PROJECT_ID
Updated property [core/project].

Nếu muốn sử dụng Bảng điều khiển Cloud, bạn có thể sử dụng giao diện người dùng để tạo một dự án mới (nếu muốn) hoặc sử dụng bất kỳ dự án nào có sẵn. Trên trang tổng quan của dự án, bạn sẽ thấy thẻ thông tin dự án cho biết mã dự án (cùng với tên và số dự án):

thẻ thông tin dự án

Lệnh cuối cùng (#5), gcloud app deploy, dùng để triển khai ứng dụng cho App Engine. Vì chúng ta chỉ mới bắt đầu, nên việc chạy mã này ngay bây giờ là không bắt buộc, nhưng chúng ta chắc chắn không chả cản trở việc triển khai mã Mô-đun 0 để xác nhận mã này hoạt động. Sau khi thực thi, hãy chọn khu vực địa lý mà bạn muốn ứng dụng chạy (thường là nơi bạn sinh sống). Tuy nhiên, bạn không thể thay đổi lựa chọn này sau khi đặt. Sau đó, xem phần thông tin triển khai còn lại. Khi quá trình xem xét hoàn tất, bạn sẽ nhận được thông báo về URL nơi ứng dụng của bạn sẽ được phân phát. Dưới đây là phiên bản tóm lược về những gì bạn có thể thấy:

$ 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

Nếu không dùng App Engine trong một thời gian, bạn có thể nhận thấy lệnh appcfg.py update triển khai ban đầu đã được thay thế bằng gcloud app deploy. Để tìm hiểu thêm về gcloud app deploy, hãy xem trang tài liệu của ứng dụng này.

Một thay đổi khác gần đây là các ứng dụng được triển khai URL, được điều chỉnh từ http://PROJECT_ID.appspot.com thành http://PROJECT_ID.REG_ABBR.r.appspot.com. Hầu hết các ứng dụng sau này sẽ được chuyển đổi sang định dạng mới. Bạn có thể xem thêm thông tin về định dạng URL trong tài liệu về yêu cầu và định tuyến.

Sau khi triển khai ứng dụng, hãy làm mới trình duyệt (có thể vài lần) để xem các lượt truy cập gần đây nhất:

ứng dụng visitme

Nếu ứng dụng của bạn mới, bạn sẽ chỉ thấy một hoặc một vài lượt truy cập.

4. Thêm thư viện bên thứ ba của Flask

Môi trường thời gian chạy App Engine Python 2 cung cấp một tập hợp các tính năng "tích hợp" thư viện của bên thứ ba, bạn chỉ cần chỉ định các thư viện đó trong tệp app.yaml để sử dụng. Mặc dù không cần sử dụng quá trình di chuyển này, nhưng chúng sẽ được trình bày trong hướng dẫn di chuyển tiếp theo (cho Mô-đun 2).

Các thư viện bên thứ ba không được tích hợp sẵn phải được chỉ định trong tệp có tên requirements.txt và được cài đặt cục bộ trong thư mục lib trong cùng thư mục với mã xử lý ứng dụng nơi mọi nội dung được tải lên App Engine. Có thêm thông tin trong tài liệu về cách nhóm các thư viện của bên thứ ba.

Các thư viện được sao chép như Flask yêu cầu bạn yêu cầu App Engine tìm các thư viện đó trong thư mục lib bằng cách sử dụng tệp cấu hình appengine_config.py. Tệp cấu hình appengine_config.py được đặt trong cùng thư mục ứng dụng cấp cao nhất với requirements.txtlib. Trong phần này của hướng dẫn, bạn sẽ:

  • Tạo requirements.txt (chỉ định các thư viện của bên thứ ba [không tích hợp] đã sao chép)
  • Tạo appengine_config.py (nhận dạng thư viện của bên thứ ba)
  • Cài đặt các gói và phần phụ thuộc (của bên thứ ba)

1. Tạo requirements.txt

Tạo tệp requirements.txt để chỉ định các gói. Trong trường hợp của chúng ta, Flask là thư viện bên thứ ba cần thiết. Tại thời điểm viết bài này, phiên bản mới nhất là 1.1.2, vì vậy, hãy tạo requirements.txt bằng một dòng sau:

Flask==1.1.2

Hãy tham khảo tài liệu về requirements.txt để tìm hiểu thêm về các định dạng được chấp nhận.

2. Tạo appengine_config.py

Bước tiếp theo là yêu cầu App Engine nhận ra các thư viện bên thứ ba bên ngoài. Tạo một tệp có tên appengine_config.py với nội dung sau:

from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)

Mã này thực hiện đúng những gì chúng ta đã chỉ định trước đó, tức là trỏ App Engine đến thư mục lib cho các thư viện được sao chép.

3. Cài đặt(các) gói và phần phụ thuộc

Bây giờ, hãy chạy lệnh pip install để tạo thư mục lib và cài đặt Flask cùng các phần phụ thuộc của thư mục đó ở đó:

$ pip install -t lib -r requirements.txt

Cho dù bạn sử dụng pip hay pip2, sau khi cài đặt gói hoàn tất, bạn sẽ có một thư mục lib có nội dung tương tự như:

$ 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. Cập nhật tệp ứng dụng

Bây giờ, hãy cập nhật tệp ứng dụng, main.py.

1. Nhập

Các lệnh nhập xuất hiện trước như trong tất cả các tệp Python. Sau đó là quá trình nhập khung webapp2, sau đó là thư viện Datastore ndb và cuối cùng là tiện ích App Engine xử lý các mẫu có phiên bản Django. Bạn sẽ thấy những thông tin sau:

  • TRƯỚC KHI:
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.webapp import template

Khi chuyển sang Flask, bạn sẽ nhập đồng thời cả Flask và trình kết xuất mẫu. Xoá cặp đối tượng nhập liên quan đến webapp2 và thay thế chúng như sau (giữ nguyên lệnh nhập ndb):

  • SAU:
from flask import Flask, render_template, request
from google.appengine.ext import ndb

2. Khởi động

Các ứng dụng sử dụng webapp2 yêu cầu một mảng (danh sách Python) liệt kê tất cả các tuyến và trình xử lý trong bất kỳ tệp Python nào (có thể có những tệp khác):

  • TRƯỚC KHI:
app = webapp2.WSGIApplication([
    ('/', MainHandler),
], debug=True)

Xin lưu ý rằng app.yaml thực hiện định tuyến cấp cao hơn và có thể gọi nhiều trình xử lý. Ứng dụng mẫu đủ đơn giản để tất cả các tuyến đều đến trình xử lý main.py.

Bình không sử dụng bảng định tuyến như thế này, vì vậy, hãy xoá những dòng này trong main.py. Bình cũng yêu cầu khởi chạy, vì vậy, hãy thêm dòng sau ở đầu của main.py ngay bên dưới mục nhập:

  • SAU:
app = Flask(__name__)

Trong Flask, bạn khởi chạy khung rồi sử dụng trình trang trí để xác định các tuyến. Ngoài ra, các tuyến được ghép nối với các hàm, chứ không phải lớp hay phương thức.

Việc đưa hướng dẫn về Flask vào lớp học lập trình này là nằm ngoài phạm vi của quy trình này. Vì vậy, hãy dành thời gian xem hướng dẫn về Flask và xem tài liệu về Flask để làm quen với khung này.

3. Mô hình dữ liệu

Không có thay đổi nào ở đây. Kho dữ liệu sẽ là trọng tâm của lớp học lập trình tiếp theo.

4. Trình xử lý

Bất kể bạn sử dụng khung nào (webapp2 hay Flask), ứng dụng đều thực hiện 3 việc:

  1. Xử lý các yêu cầu GET về đường dẫn gốc (/)
  2. Đăng ký một trang web "truy cập" (tạo/lưu trữ đối tượng Visit)
  3. Hiển thị 10 lượt truy cập hàng đầu gần đây nhất (với mẫu được xác định trước, index.html)

Khung webapp2 sử dụng mô hình thực thi dựa trên lớp, trong đó các trình xử lý được tạo cho từng phương thức HTTP được hỗ trợ. Trong trường hợp đơn giản này, chúng ta chỉ có GET, vì vậy, phương thức get() được định nghĩa:

  • TRƯỚC KHI:
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}))

Như đã đề cập ở trên, Flask tự định tuyến. Thay vì một lớp trình xử lý, bạn viết các hàm và trang trí các hàm đó bằng tuyến đường mà chúng được gọi đến. Người dùng có thể chỉ định các phương thức HTTP được xử lý trong lệnh gọi trình trang trí, tức là @app.route('/app/', methods=['GET', 'POST']). Vì giá trị mặc định chỉ là GET (và ngầm ẩn là HEAD), nên bạn có thể bỏ qua giá trị này.

Khi di chuyển sang Flask, hãy thay thế lớp MainHandler và phương thức get() của lớp này bằng hàm định tuyến Flask sau đây:

  • SAU:
@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)

Tất nhiên, ví dụ này không đại diện cho ứng dụng của bạn, chắc chắn sẽ phức tạp hơn mẫu này. Một mục tiêu chính của những bài hướng dẫn này là giúp bạn bắt đầu, xây dựng một phần "bộ nhớ cơ bắp" đó và biết được nơi cần thực hiện thay đổi trong mã dành riêng cho App Engine. Để xác nhận rằng bạn đã thực hiện thay đổi này một cách chính xác, hãy so sánh mô-đun của bạn với Mô-đun 1 main.py.

5. Tệp phụ trợ

Không có thay đổi nào đối với tệp .gcloudignore. Mục đích của thư viện này là chỉ định các tệp không cần triển khai cho App Engine khi không cần thiết để triển khai và thực thi ứng dụng, bao gồm nhưng không giới hạn ở Python phụ trợ, kiểm soát nguồn, mã nguyên mẫu repo và các tệp khác. .gcloudignore của chúng tôi có dạng như sau (với các bình luận bị xoá cho ngắn gọn):

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

6. Cập nhật tệp mẫu HTML

1. Di chuyển tệp mẫu

Trong thư mục kho lưu trữ cơ sở (Mô-đun 0), tệp mẫu index.html nằm trong cùng thư mục với các tệp ứng dụng. Vì Flask yêu cầu tệp HTML được đặt trong thư mục templates, nên bạn phải tạo thư mục đó (mkdir templates) và di chuyển index.html vào đó. Trong hệ thống tuân thủ POSIX như Linux hoặc Mac OS X, các lệnh sẽ là:

mkdir templates
mv index.html templates

2. Cập nhật tệp mẫu

Sau khi bạn chuyển index.html sang templates, đã đến lúc thực hiện chỉnh sửa nhỏ nhưng bắt buộc. Hãy cùng xem toàn bộ tệp mẫu gốc:

<!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>

Trong khi webapp2 sử dụng các mẫu Django thực thi các lệnh gọi được như visit.timestamp.ctime không có dấu ngoặc đơn ( ), thì Jinja2 yêu cầu các mẫu này một cách rõ ràng. Mặc dù điều này nghe có vẻ chỉ là một tinh chỉnh nhỏ, nhưng các mẫu Jinja có thể hoạt động hiệu quả hơn ngay từ đầu vì bạn có thể truyền đối số trong các lệnh gọi.

Trong Django, bạn phải tạo một "thẻ mẫu" hoặc viết bộ lọc. Như đã hiểu, hãy cập nhật index.html bằng cách thêm một cặp dấu ngoặc đơn vào lệnh gọi visit.timestamp.ctime:

  • TRƯỚC KHI:
<li>{{ visit.timestamp.ctime }} from {{ visit.visitor }}</li>
  • SAU:
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>

Đây là thay đổi duy nhất cần thiết; bạn không cần thay đổi index.html đối với tất cả lớp học lập trình còn lại về việc di chuyển.

7. Tóm tắt/Dọn dẹp

Triển khai ứng dụng

Khi bạn đã hoàn tất tất cả các thay đổi trong hướng dẫn này, các tệp trong thư mục ứng dụng của bạn phải giống hệt (hoặc gần như vậy) với tệp trong Thư mục kho lưu trữ mô-đun 1. Bây giờ, hãy triển khai và thấy rằng ứng dụng Module 1 Flask chạy giống hệt với phiên bản Module 0 webapp2.

Sử dụng lệnh gcloud app deploy như đã làm trước đó khi triển khai mã Mô-đun 0 ban đầu. Truy cập ứng dụng tại PROJECT_ID.appspot.com, bất kể từ trình duyệt web hay bằng lệnh curl hoặc wget để xác nhận rằng ứng dụng hoạt động như mong đợi.

Nếu bạn gặp một loại lỗi máy chủ nào đó, thì thường là do một số loại lỗi chính tả trong mã Python của bạn. Xem nhật ký ứng dụng của bạn để điều tra. Đồng thời, hãy so sánh các tệp của bạn với các tệp trong kho lưu trữ Mô-đun 1 (đường liên kết ở trên).

Không bắt buộc: Dọn dẹp

Còn việc dọn dẹp để tránh bị tính phí cho đến khi bạn sẵn sàng chuyển sang lớp học lập trình di chuyển tiếp theo thì sao? Là nhà phát triển hiện tại, có thể bạn đã nắm bắt được thông tin về giá của App Engine.

Không bắt buộc: Tắt ứng dụng

Nếu bạn chưa sẵn sàng chuyển đến hướng dẫn tiếp theo, hãy vô hiệu hoá ứng dụng để tránh phát sinh phí. Khi đã sẵn sàng chuyển sang lớp học lập trình tiếp theo, bạn có thể bật lại lớp học này. Mặc dù bị vô hiệu hoá, ứng dụng của bạn sẽ không nhận được bất kỳ lưu lượng truy cập nào để bị tính phí. Tuy nhiên, một điều khác bạn có thể bị tính phí là mức sử dụng Datastore nếu vượt quá hạn mức miễn phí, vì vậy, hãy xoá đủ để nằm trong giới hạn đó.

Mặt khác, nếu không định tiếp tục quá trình di chuyển và muốn xoá hoàn toàn mọi thứ, thì bạn có thể ngừng cung cấp dự án của mình.

Các bước tiếp theo

Có hai mô-đun di chuyển BẮT ĐẦU với mã Mô-đun 1 đã hoàn tất, Mô-đun 2 và 7:

  • Mô-đun 2 (bắt buộc nếu bạn sử dụng Datastore)
    • Di chuyển từ App Engine ndb sang Cloud NDB
    • Sau khi chuyển sang Cloud NDB, bạn sẽ có thể sử dụng nhiều phương án khác
      • Vùng chứa ứng dụng để chạy trên Cloud Run
      • Tiếp tục di chuyển ứng dụng sang thư viện ứng dụng Cloud Datastore
      • Di chuyển ứng dụng của bạn sang Cloud Firestore để sử dụng các tính năng của Firebase
  • Mô-đun 7 (bắt buộc nếu bạn sử dụng Hàng đợi tác vụ [push])
    • Thêm mức sử dụng taskqueue của App Engine (đẩy)
    • Chuẩn bị ứng dụng của Mô-đun 1 để di chuyển sang Cloud Tasks trong Mô-đun 8

8. Tài nguyên khác

Vấn đề/phản hồi trong lớp học lập trình mô-đun di chuyển App Engine

Nếu bạn gặp vấn đề với lớp học lập trình này, vui lòng tìm vấn đề của bạn trước khi gửi. Đường liên kết để tìm kiếm và báo cáo vấn đề mới:

Tài nguyên di chuyển

Bạn có thể tìm thấy các đường liên kết đến các thư mục repo cho Mô-đun 0 (START) và Mô-đun 1 (Finish) trong bảng bên dưới. Bạn cũng có thể truy cập vào các tệp này từ kho lưu trữ dành cho tất cả quá trình di chuyển App Engine. Bạn có thể sao chép hoặc tải tệp ZIP xuống.

Codelab

Python 2

Python 3

Mô-đun 0

(không áp dụng)

Học phần 1

(không áp dụng)

Tài nguyên của App Engine

Dưới đây là các thông tin khác liên quan đến việc di chuyển cụ thể này: