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 tốc độ của riêng bạn) nhằm mục đích giúp các nhà phát triển Google App Engine (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à chuyển từ các dịch vụ đi kèm với thời gian chạy ban đầu sang thời gian chạy thế hệ tiếp theo vì thời gian chạy này linh hoạt hơn, mang đến cho người dùng nhiều lựa chọn dịch vụ hơn. Việc chuyển sang thời gian chạy thế hệ mới giúp bạn dễ dàng tích hợp 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 cho thấy các bước di chuyển đầu tiên để hiện đại hoá khung web trong các ứng dụng App Engine: 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 xử lý việc định tuyến, nhưng trong hướng dẫn này, chúng ta sẽ sử dụng Flask vì cộng đồng sử dụng rộng rãi khung này.

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

  • Sử dụng các thư viện của bên thứ ba (được tích hợp sẵn hoặc không)
  • 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ó

Bản 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 tiên ra mắt trên Python 2.5 vào năm 2008. Nhiều năm sau, webapp2 đã thay thế khi thời gian chạy 2.7 ngừng hoạt độ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 dùng bên ngoài App Engine dưới dạng một khung web tuân thủ WSGI, nhưng nó không tự định tuyến 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 đó, nó dựa vào App Engine, các tệp cấu hình và nhà phát triển để thực hiện việc đị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, khiến dịch vụ này không còn được dùng nữa mặc dù dịch vụ này hoạt động trên Python 3 (xem thêm vấn đề liên quan).

Mô-đun này giúp người thực hành có được trải nghiệm thực tế khi di chuyển một ứng dụng webapp2 đơn giản sang Flask, một khung hình được App Engine và nhiều dịch vụ khác bên ngoài Google Cloud hỗ trợ, giúp các ứng dụng dễ dàng di chuyển hơn nhiều. Nếu Flask không phải là khung hình mong muốn để chuyển ứng dụng của bạn sang, bạn có thể chọn một khung hình khác miễn là khung hình đó tự định tuyến. Lớp học lập trình này cho các nhà quản lý CNTT và nhà phát triển biết các bước di chuyể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.

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

  1. Thiết lập/Công việc chuẩn bị
  2. Thêm thư viện bên thứ ba 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/Công việc chuẩn bị

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

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

Là một nhà phát triển hiện tại, trang tổng quan App Engine của bạn có thể đã cho thấy những dịch vụ mà bạn đang chạy. Trong 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ó. Đảm bảo dự án có một tài khoản thanh toán đang hoạt động và App Engine (ứng dụng) được bật.

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

Kho lưu trữ di chuyển GAE có tất cả mã bạn cần. Sao chép hoặc tải tệp ZIP của kho lưu trữ đó xuống. Trong hướng dẫn này, bạn sẽ bắt đầu với mã trong thư mục Module 0 (START) và khi hoàn tất hướng dẫn, mã của bạn sẽ khớp với thư mục Module 1 (FINISH). Nếu không, hãy xem 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 Module 0 sẽ có các tệp như thế này, như minh hoạ bằng lệnh POSIX ls:

$ ls
app.yaml        index.html      main.py

3. (Làm quen lại) 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 đây:

  1. gcloud components update – cập nhật Google Cloud SDK
  2. gcloud auth login – đăng nhập vào tài khoản có thông tin đăng nhập 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 bạn chưa phát triển bằng App Engine với 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 nhanh các lệnh này.

Trước tiên, gcloud components update đảm bảo bạn có phiên bản Cloud SDK mới nhất. Khi chạy lệnh này, bạn sẽ nhận được 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 dùng gcloud auth login để xác thực cho các lệnh gcloud mà bạn sẽ đưa ra sau này:

$ 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 chế độ cài đặt dự án hiện tại 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 một dự án hiện có. Nếu đầu ra của gcloud config list không khớp với dự án đã chọn mà bạn dự đị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 rằng bạ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 Cloud Console, bạn có thể làm theo 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 bạn đã có. 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ã nhận dạng của 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, là để triển khai ứng dụng của bạn lên App Engine. Vì chúng ta mới bắt đầu, nên bạn không bắt buộc phải chạy ngay bây giờ, nhưng chắc chắn chúng tôi không khuyến khích việc triển khai mã Mô-đun 0 để xác nhận rằng mã này hoạt động. 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 thông tin này sau khi đặt. Sau đó, hãy xem phần còn lại của thông tin triển khai. Khi quá trình này hoàn tất, bạn sẽ nhận được thông báo về URL mà ứng dụng của bạn sẽ được phân phát. Sau đây là phiên bản rút gọn của 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 đã lâu không dùng App Engine, bạn có thể nhận thấy rằng lệnh triển khai ban đầu appcfg.py update đã đượ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 gcloud app deploy.

Một thay đổi gần đây khác là URL của các ứng dụng đã triển khai, đượ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 sẽ được chuyển đổi sang định dạng mới. 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 mới nhất:

ứng dụng visitme

Nếu ứng dụng của bạn là ứng dụng 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 Flask

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

Bạn phải chỉ định các thư viện bên thứ ba không được tích hợp sẵn trong một tệp có tên là requirements.txt và 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 thứ được tải lên App Engine. Tài liệu về việc gói các thư viện của bên thứ ba có thêm thông tin.

Các thư viện được sao chép như Flask yêu cầu bạn chỉ thị cho 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 một 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 bên thứ ba [không phải thư viện tích hợp sẵn] đã sao chép)
  • Tạo appengine_config.py (nhận dạng các thư viện 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 của bạn. Trong trường hợp này, Flask là thư viện cần thiết của bên thứ ba. 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 dòng lệnh sau:

Flask==1.1.2

Hãy tham khảo tài liệu 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à để App Engine nhận dạng các thư viện bên ngoài của bên thứ ba. Tạo một tệp có tên là 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)

Đoạn mã này thực hiện chính xác 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 đã 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 quá trình 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ư sau:

$ 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 sẽ xuất hiện đầu tiên như trong tất cả các tệp Python. Sau khi nhập khung webapp2, bạn sẽ nhập thư viện Datastore ndb và cuối cùng là tiện ích App Engine xử lý các mẫu theo kiểu 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 cả Flask và các phần của trình kết xuất mẫu cùng một lúc. Xoá cặp dữ liệu nhập liên quan đến webapp2 và thay thế chúng như sau (giữ nguyên dữ liệu 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 duy nhất (danh sách Python) liệt kê tất cả các tuyến đường và trình xử lý trong bất kỳ tệp Python nào (có thể có các 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 các trình xử lý khác nhau. Ứng dụng mẫu này đủ đơn giản để tất cả các tuyến đều đến trình xử lý main.py.

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

  • SAU:
app = Flask(__name__)

Trong Flask, bạn khởi động khung rồi dùng các trình trang trí để xác định các tuyến đường. Ngoài ra, các tuyến đường được ghép nối với các hàm, chứ không phải các lớp hoặc 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à không cần thiết, vì vậy, hãy dành thời gian tìm hiểu hướng dẫn về Flask và xem tài liệu về Flask để làm quen hơn với khung này.

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

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

4. Trình xử lý

Ứng dụng này, bất kể bạn dùng khung nào (webapp2 hoặc Flask), đều thực hiện 3 việc:

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

Khung webapp2 sử dụng một 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 xác định:

  • 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ự thực hiện việc định tuyến. Thay vì một lớp trình xử lý, bạn viết các hàm và trang trí chúng bằng tuyến đường mà chúng sẽ được gọi. 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 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 đó bằng hàm định tuyến Flask sau:

  • 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, điều này không đại diện cho ứng dụng của bạn, vì ứng dụng của bạn chắc chắn sẽ phức tạp hơn ứng dụng mẫu này. Một mục tiêu chính của các hướng dẫn này là giúp bạn bắt đầu, xây dựng một số "trí nhớ cơ bắp" và hiểu được vị trí cầ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 của bạn với Phụ lục 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 tệp này là chỉ định những tệp không triển khai cho App Engine mà 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ẫu repo và các tệp khác. .gcloudignore của chúng ta sẽ có dạng như sau (đã xoá phần bình luận để ngắn gọn hơ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 các 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 một 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 di chuyển index.html vào templates, đã đến lúc thực hiện một chỉnh sửa nhỏ nhưng bắt buộc. Hãy xem toàn bộ tệp mẫu ban đầu:

<!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 như visit.timestamp.ctime không có dấu ngoặc đơn ( ), Jinja2 yêu cầu các lệnh gọi một cách rõ ràng. Mặc dù nghe có vẻ như đây chỉ là một thay đổi nhỏ, nhưng các mẫu Jinja mạnh mẽ hơn ngay từ đầu vì bạn có thể truyền các đối số trong lệnh gọi.

Trong Django, bạn phải tạo "thẻ mẫu" hoặc viết một bộ lọc. Khi đã hiểu rõ điều này, 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 thêm cho index.html đối với tất cả các lớp học lập trình còn lại về quy trình 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 sẽ giống hệt (hoặc gần giống) với tệp trong thư mục kho lưu trữ Mô-đun 1. Giờ đây, hãy triển khai và xem ứng dụng Flask của Mô-đun 1 có chạy giống hệt như phiên bản webapp2 của Mô-đun 0 hay không.

Sử dụng lệnh gcloud app deploy như chúng ta đã làm trước đó khi triển khai mã Mô-đun 0 ban đầu. Truy cập vào ứng dụng tại PROJECT_ID.appspot.com, cho dù là từ trình duyệt web hay 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 phải một loại lỗi máy chủ nào đó, thì điều đó thường có nghĩa là bạn đã mắc phải một lỗi chính tả nào đó trong mã Python. Hãy xem nhật ký ứng dụng để điều tra. Bạn cũng có thể so sánh các tệp của mình với các tệp trong kho lưu trữ Mô-đun 1 (đường liên kết ngay phía trên).

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

Bạn có thể dọn dẹp để tránh bị tính phí cho đến khi sẵn sàng chuyển sang lớp học lập trình di chuyển tiếp theo. Là nhà phát triển hiện tại, có thể bạn đã nắm đượ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 sang hướng dẫn tiếp theo, hãy tắt ứng dụng để không bị tính 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 tính năng này. Khi ứng dụng của bạn bị vô hiệu hoá, ứng dụng sẽ không nhận được lưu lượng truy cập nào để phát sinh phí. Tuy nhiên, một khoản phí khác mà bạn có thể phải trả là mức sử dụng Datastore nếu mức này vượt quá hạn mức miễn phí. Vì vậy, hãy xoá đủ để giảm xuống dưới hạn mức đó.

Mặt khác, nếu không muốn tiếp tục di chuyển và muốn xoá hoàn toàn mọi thứ, bạn có thể tắt dự án.

Các bước tiếp theo

Có 2 mô-đun di chuyển BẮT ĐẦU bằng mã Mô-đun 1 đã hoàn thành, đó là 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ó nhiều lựa chọn khác
      • Đóng gói ứng dụng của bạn vào vùng chứa để chạy trên Cloud Run
      • Tiếp tục di chuyển ứng dụng của bạn sang thư viện ứng dụng Cloud Datastore
      • Di chuyển ứng dụng sang Cloud Firestore để truy cập vào 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 App Engine (push) taskqueue
    • Chuẩn bị ứng dụng Mô-đun 1 để di chuyển sang Cloud Tasks trong Mô-đun 8

8. Tài nguyên khác

Vấn đề/ý kiến phản hồi về 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 kiếm vấn đề của bạn trước khi báo cáo. Đường liên kết để tìm kiếm và tạo vấn đề mới:

Tài nguyên di chuyển

Bạn có thể tìm thấy đường liên kết đến các thư mục kho lưu trữ cho Mô-đun 0 (BẮT ĐẦU) và Mô-đun 1 (KẾT THÚC) trong bảng bên dưới. Bạn cũng có thể truy cập vào kho lưu trữ cho tất cả các hoạt động di chuyển App Engine mà bạn có thể sao chép hoặc tải tệp ZIP xuống.

Lớp học lập trình

Python 2

Python 3

Module 0

code

(không áp dụng)

Module 1

code

(không áp dụng)

Tài nguyên App Engine

Dưới đây là các tài nguyên khác liên quan đến quá trình di chuyển cụ thể này: