Mô-đun 2: Di chuyển từ App Engine ndb sang Cloud NDB

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 này hướng dẫn bạn cách di chuyển từ ndb (Cơ sở dữ liệu tiếp theo) được tích hợp sẵn của App Engine sang Thư viện ứng dụng Cloud NDB.

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

  • Sử dụng thư viện ndb App Engine (nếu bạn chưa quen với thư viện này)
  • Di chuyển từ ndb sang Cloud NDB
  • Tiếp tục di chuyển ứng dụng của bạn sang Python 3

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

Trong Mô-đun 1, chúng ta đã di chuyển các khung web từ webapp2 tích hợp của App Engine sang Flask. Trong lớp học lập trình này, chúng ta sẽ tiếp tục chuyển từ các dịch vụ tích hợp của App Engine bằng cách chuyển từ thư viện ndb của App Engine sang Cloud NDB của Google.

Sau khi hoàn tất quá trình di chuyển này, bạn có thể:

  1. Di chuyển sang Python 3 và thời gian chạy App Engine thế hệ tiếp theo
  2. Di chuyển sang Cloud Datastore (thư viện ứng dụng cho các ứng dụng không phải App Engine)
  3. Tạo vùng chứa cho ứng dụng Python 2 (hoặc 3) và di chuyển sang Cloud Run
  4. Thêm việc sử dụng hàng đợi tác vụ App Engine (push) rồi di chuyển sang Cloud Tasks

Nhưng chúng tôi vẫn chưa đạt được mục tiêu đó. Hãy hoàn thành lớp học lập trình này trước khi cân nhắc các bước tiếp theo. Quá trình di chuyển trong hướng dẫn này bao gồm các bước chính sau:

  1. Thiết lập/Công việc chuẩn bị
  2. Thêm thư viện Cloud NDB
  3. Cập nhật tệp ứng dụng

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 đó triển khai ứng dụng cơ sở để đảm bảo chúng ta bắt đầu bằng mã nguồn hoạt động.

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

Nếu đã hoàn thành lớp học lập trình Mô-đun 1, bạn nên sử dụng lại chính dự án (và mã) đó. Ngoài ra, bạn có thể 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ó khác. Đảm bảo dự án có một tài khoản thanh toán đang hoạt động và App Engine được bật.

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

Một trong những điều kiện tiên quyết là bạn phải có một ứng dụng mẫu Phụ lục 1 đang hoạt động. Hãy sử dụng giải pháp của bạn nếu bạn đã hoàn thành hướng dẫn đó. Bạn có thể hoàn thành ngay bây giờ (đường liên kết ở trên) hoặc nếu muốn bỏ qua, hãy sao chép kho lưu trữ Mô-đun 1 (đường liên kết ở bên dưới).

Cho dù bạn dùng mã của mình hay mã của chúng tôi, mã của Mô-đun 1 sẽ là nơi chúng ta BẮT ĐẦU. Lớp học lập trình Mô-đun 2 này sẽ hướng dẫn bạn từng bước và khi hoàn tất, lớp học này sẽ giống với mã tại điểm KẾT THÚC (bao gồm cả một cổng "bổ sung" không bắt buộc từ Python 2 sang 3):

Thư mục mã STARTing Module 1 (Bắt đầu mô-đun 1) phải có nội dung sau:

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

Nếu đã hoàn thành hướng dẫn về Mô-đun 1, bạn cũng sẽ có một thư mục lib chứa Flask và các phần phụ thuộc của nó. Nếu bạn chưa có thư mục lib, hãy tạo thư mục này bằng lệnh pip install -t lib -r requirements.txt để chúng ta có thể triển khai ứng dụng cơ sở này ở bước tiếp theo. Nếu đã cài đặt cả Python 2 và 3, bạn nên sử dụng pip2 thay vì pip để tránh nhầm lẫn với Python 3.

3. (Triển khai lại) Ứng dụng Mô-đun 1

Các bước chuẩn bị còn lại mà bạn cần thực hiện ngay:

  1. Làm quen lại với công cụ dòng lệnh gcloud (nếu cần).
  2. (Triển khai lại) mã Mô-đun 1 vào App Engine (nếu cần)

Sau khi bạn thực hiện thành công các bước đó và xác nhận rằng các bước đó đang hoạt động, chúng ta sẽ tiếp tục trong hướng dẫn này, bắt đầu bằng các tệp cấu hình.

4. Cập nhật tệp cấu hình (thêm thư viện Cloud NDB)

Nhiều dịch vụ tích hợp ban đầu của App Engine đã phát triển thành các sản phẩm riêng và Datastore là một trong số đó. Hiện tại, các ứng dụng không phải App Engine có thể sử dụng Cloud Datastore. Đối với người dùng ndb lâu năm, nhóm Google Cloud đã tạo thư viện ứng dụng Cloud NDB để giao tiếp với Cloud Datastore. Thư viện này có sẵn cho cả Python 2 và 3.

Hãy cập nhật các tệp xác nhận để thay thế App Engine ndb bằng Cloud NDB, sau đó sửa đổi ứng dụng của chúng ta.

1. Cập nhật requirements.txt

Trong Mô-đun 1, phần phụ thuộc bên ngoài duy nhất cho ứng dụng của chúng ta là Flask. Bây giờ, chúng ta sẽ thêm Cloud NDB. Sau đây là nội dung tệp requirements.txt của bạn khi kết thúc Mô-đun 1:

  • TRƯỚC KHI:
Flask==1.1.2

Việc di chuyển khỏi App Engine ndb yêu cầu thư viện Cloud NDB (google-cloud-ndb), vì vậy, hãy thêm gói của thư viện này vào requirements.txt.

  • SAU:
Flask==1.1.2
google-cloud-ndb==1.7.1

Tại thời điểm viết lớp học lập trình này, phiên bản được đề xuất mới nhất là 1.7.1, nhưng requirements.txt trong kho lưu trữ có thể có phiên bản mới hơn. Bạn nên dùng phiên bản mới nhất của mỗi thư viện, nhưng nếu các phiên bản này không hoạt động, bạn có thể quay lại dùng một bản phát hành cũ hơn.

Xoá thư mục lib nếu bạn có thư mục này và không vừa tạo thư mục này ở trên. Giờ đây, hãy (cài đặt lại) các thư viện đã cập nhật bằng lệnh pip install -t lib -r requirements.txt, sử dụng pip2 thay vì pip nếu cần.

2. Cập nhật app.yaml

Việc thêm các thư viện ứng dụng Google Cloud như google-cloud-ndb có một số yêu cầu, tất cả đều xoay quanh việc đưa các thư viện"tích hợp", các gói bên thứ ba đã có sẵn trên máy chủ của Google. Bạn không liệt kê các tệp này trong requirements.txt cũng như không sao chép chúng bằng pip install. Các yêu cầu duy nhất:

  1. Chỉ định các thư viện tích hợp trong app.yaml
  2. Chỉ cho họ những thư viện bên thứ ba đã sao chép mà họ có thể sử dụng (trong lib)

Sau đây là app.yaml BẮT ĐẦU của Mô-đun 1:

  • TRƯỚC KHI:
runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

Giờ đây, hãy thêm các dòng sau vào app.yaml để tham chiếu một cặp gói đi kèm của bên thứ ba: grpciosetuptools trong phần libraries mới:

libraries:
- name: grpcio
  version: 1.0.0
- name: setuptools
  version: 36.6.0

Tại sao nên dùng các thư viện tích hợp này? gRPC là một khung RPC mở được tất cả thư viện ứng dụng Google Cloud sử dụng, bao gồm cả google-cloud-ndb. Thư viện grpcio là bộ chuyển đổi gRPC Python và do đó là bắt buộc. Lý do chúng tôi đưa ra thông báo setuptools là sắp đến.

  • SAU:

Với những thay đổi nêu trên, app.yaml được cập nhật của bạn giờ đây sẽ có dạng như sau:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

libraries:
- name: grpcio
  version: 1.0.0
- name: setuptools
  version: 36.6.0

3. Cập nhật appengine_config.py

Công cụ pkg_resources (một phần của thư viện setuptools) được dùng để cho phép các thư viện tích hợp sẵn của bên thứ ba truy cập vào các thư viện được gói. Cập nhật appengine_config.py để sử dụng pkg_resources nhằm trỏ đến các thư viện đi kèm trong lib. Sau khi bạn hoàn tất thay đổi này, toàn bộ tệp sẽ có dạng như sau:

import pkg_resources
from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
# Add libraries to pkg_resources working set to find the distribution.
pkg_resources.working_set.add_entry(PATH)

5. Cập nhật tệp ứng dụng

Sau khi hoàn tất các thủ tục về tệp cấu hình, giờ đây, bạn có thể di chuyển từ ndb sang Cloud NDB. Để hoàn tất quá trình di chuyển, hãy cập nhật các thư viện đã nhập và thêm việc sử dụng tính năng quản lý bối cảnh trong main.py.

1. Nhập

Thực hiện thao tác hoán đổi nhập sau đây trong main.py:

  • TRƯỚC KHI
from google.appengine.ext import ndb
  • SAU:
from google.cloud import ndb

Đôi khi, thay đổi từ thư viện App Engine sang thư viện Google Cloud chỉ đơn giản như trường hợp này. Đối với các dịch vụ tích hợp đã trở thành sản phẩm đầy đủ của Google Cloud, bạn sẽ nhập các thuộc tính từ google.cloud thay vì google.appengine.

2. Quyền truy cập vào Datastore

Để có thể sử dụng thư viện Cloud NDB, ứng dụng của bạn phải sử dụng trình quản lý bối cảnh Python. Mục đích của các tài sản này là "chặn" quyền truy cập vào tài nguyên để người dùng phải mua trước khi có thể sử dụng. Trình quản lý bối cảnh dựa trên kỹ thuật kiểm soát khoa học máy tính được gọi là Phân bổ tài nguyên là khởi tạo (hoặc RAII). Trình quản lý bối cảnh được dùng với các tệp Python (phải được mở trước khi có thể truy cập) và tính đồng thời, "khoá vòng lặp" phải được lấy trước khi mã trong "phần quan trọng" có thể được thực thi.

Tương tự, Cloud NDB yêu cầu bạn lấy bối cảnh của một ứng dụng để giao tiếp với Datastore trước khi bất kỳ lệnh Datastore nào có thể thực thi. Trước tiên, hãy tạo một ứng dụng (ndb.Client()) bằng cách thêm ds_client = ndb.Client() vào main.py ngay sau khi khởi tạo Flask:

app = Flask(__name__)
ds_client = ndb.Client()

Lệnh Pythonwith chỉ được dùng để lấy ngữ cảnh của một đối tượng. Bao bọc mọi khối mã truy cập Datastore bằng câu lệnh with.

Dưới đây là các hàm tương tự trong Mô-đun 1 để ghi một Thực thể mới vào Datastore và đọc để hiển thị các Thực thể được thêm gần đây nhất:

  • TRƯỚC KHI:

Sau đây là mã ban đầu không có tính năng quản lý bối cảnh:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return (v.to_dict() for v in Visit.query().order(
            -Visit.timestamp).fetch(limit))
  • SAU:

Bây giờ, hãy thêm with ds_client.context(): và di chuyển mã truy cập Datastore vào khối with:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    with ds_client.context():
        return (v.to_dict() for v in Visit.query().order(
                -Visit.timestamp).fetch(limit))

Ứng dụng trình điều khiển chính vẫn giống như ứng dụng ở Mô-đun 1 vì không có mã ndb (cũng như Cloud NDB) ở đây:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

Tốt nhất là bạn nên đảm bảo có sự phân biệt rõ ràng giữa mã xử lý ứng dụng và quyền truy cập dữ liệu. Bằng cách này, mã xử lý ứng dụng chính của bạn sẽ không thay đổi khi cơ chế lưu trữ dữ liệu cơ bản bị thay đổi như chúng ta đã làm với quy trình di chuyển này.

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

Triển khai ứng dụng

Triển khai lại ứng dụng bằng gcloud app deploy và xác nhận rằng ứng dụng hoạt động. Mã của bạn hiện phải khớp với mã trong kho lưu trữ Mô-đun 2.

Nếu bạn bắt đầu tham gia loạt bài này mà chưa thực hiện bất kỳ lớp học lập trình nào trước đó, thì bản thân ứng dụng sẽ không thay đổi; ứng dụng này sẽ đăng ký tất cả lượt truy cập vào trang web chính (/) và trông như thế này sau khi bạn truy cập vào trang web đủ số lần:

ứng dụng visitme

Chúc mừng bạn đã hoàn thành lớp học lập trình thứ 2 này. Bạn vừa hoàn tất quá trình di chuyển, vì đây là quá trình di chuyển rất nên thực hiện cuối cùng trong loạt bài này đối với Datastore.

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

Từ đây, bạn có thể linh hoạt trong bước đi tiếp theo. Chọn một trong các tuỳ chọn sau:

  • Phần thưởng của Mô-đun 2: Tiếp tục xem phần thưởng của hướng dẫn này bên dưới để khám phá cách chuyển đổi sang Python 3 và thời gian chạy App Engine thế hệ tiếp theo.
  • Module 7: App Engine Push Task Queues (bắt buộc nếu bạn sử dụng Task Queues [push])
    • Thêm các tác vụ đẩy taskqueue của App Engine vào ứng dụng Mô-đun 1
    • Chuẩn bị cho người dùng di chuyển sang Cloud Tasks trong Mô-đun 8
  • Mô-đun 4: Di chuyển sang Cloud Run bằng Docker
    • Đóng gói ứng dụng của bạn vào vùng chứa để chạy trên Cloud Run bằng Docker
    • Cho phép bạn tiếp tục sử dụng Python 2
  • Module 5: Di chuyển sang Cloud Run bằng Cloud Buildpacks
    • Tạo vùng chứa cho ứng dụng để chạy trên Cloud Run bằng Cloud Buildpacks
    • Bạn không cần biết gì về Docker, vùng chứa hoặc Dockerfile
    • Bạn phải di chuyển ứng dụng sang Python 3
  • Phụ lục 3:
    • Hiện đại hoá quyền truy cập vào Datastore từ Cloud NDB sang Cloud Datastore
    • Đây là thư viện dùng cho các ứng dụng Python 3 App Engine và các ứng dụng không phải App Engine

7. THƯỞNG: Di chuyển sang Python 3

Để truy cập vào thời gian chạy và các tính năng mới nhất của App Engine, bạn nên di chuyển sang Python 3. Trong ứng dụng mẫu của chúng tôi, Datastore là dịch vụ tích hợp duy nhất mà chúng tôi sử dụng. Kể từ khi di chuyển từ ndb sang Cloud NDB, giờ đây, chúng tôi có thể chuyển sang thời gian chạy Python 3 của App Engine.

Tổng quan

Mặc dù quy trình chuyển đổi sang Python 3 không nằm trong phạm vi hướng dẫn của Google Cloud, nhưng phần này của lớp học lập trình sẽ giúp nhà phát triển hiểu được sự khác biệt giữa thời gian chạy App Engine Python 3. Một tính năng nổi bật của thời gian chạy thế hệ tiếp theo là đơn giản hoá quyền truy cập vào các gói bên thứ ba; bạn không cần chỉ định các gói tích hợp trong app.yaml cũng như không cần sao chép hoặc tải các thư viện không tích hợp sẵn lên; các thư viện này sẽ được cài đặt ngầm ẩn khi được liệt kê trong requirements.txt.

Vì mẫu của chúng tôi rất cơ bản Cloud NDB tương thích với Python 2-3, nên không cần chuyển mã xử lý ứng dụng một cách rõ ràng sang 3.x; ứng dụng chạy trên 2.x và 3.x mà không bị sửa đổi, nghĩa là trong trường hợp này, bạn chỉ cần thay đổi cấu hình:

  1. Đơn giản hoá app.yaml để tham chiếu Python 3 và xoá các thư viện của bên thứ ba.
  2. Xoá appengine_config.py và thư mục lib vì chúng không còn cần thiết nữa.

Ngoài main.py, các tệp requirements.txttemplates/index.html vẫn giữ nguyên.

Đơn giản hoá app.yaml

TRƯỚC KHI:

Thay đổi thực sự duy nhất đối với ứng dụng mẫu này là rút ngắn đáng kể app.yaml. Để bạn tiện theo dõi, sau đây là những gì chúng ta đã có trong app.yaml khi kết thúc Mô-đun 2:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

libraries:
- name: grpcio
  version: 1.0.0
- name: setuptools
  version: 36.6.0

SAU:

Trong Python 3, các chỉ thị threadsafe, api_versionlibraries đều ngừng hoạt động; tất cả ứng dụng đều được giả định là an toàn cho luồng và api_version không được dùng trong Python 3. Các dịch vụ App Engine không còn cài đặt sẵn các gói bên thứ ba tích hợp, vì vậy libraries cũng không được dùng nữa. Hãy xem tài liệu về các thay đổi đối với app.yaml để biết thêm thông tin về những thay đổi này. Do đó, bạn nên xoá cả 3 phiên bản này khỏi app.yaml và cập nhật lên phiên bản Python 3 được hỗ trợ (xem bên dưới).

Không bắt buộc: Sử dụng chỉ thị handlers

Ngoài ra, chỉ thị handlers (chuyển hướng lưu lượng truy cập tại các ứng dụng App Engine) cũng không được dùng nữa. Vì thời gian chạy thế hệ tiếp theo yêu cầu các khung web quản lý việc định tuyến ứng dụng, nên bạn phải thay đổi tất cả "tập lệnh trình xử lý" thành "auto". Khi kết hợp các thay đổi ở trên, bạn sẽ có được app.yaml sau đây:

runtime: python38

handlers:
- url: /.*
  script: auto

Tìm hiểu thêm về script: auto trên trang tài liệu của công cụ này.

Xoá chỉ thị handlers

handlers không được dùng nữa, bạn cũng có thể xoá toàn bộ phần này, chỉ để lại app.yaml trên một dòng:

runtime: python38

Theo mặc định, thao tác này sẽ khởi chạy máy chủ web WSGI Gunicorn có sẵn cho tất cả các ứng dụng. Nếu bạn đã quen với gunicorn, thì đây là lệnh được thực thi khi lệnh này được khởi động theo mặc định bằng app.yaml cơ bản:

gunicorn main:app --workers 2 -c /config/gunicorn.py

Không bắt buộc: Sử dụng chỉ thị entrypoint

Tuy nhiên, nếu ứng dụng của bạn yêu cầu một lệnh khởi động cụ thể, thì bạn có thể chỉ định lệnh đó bằng chỉ thị entrypoint, trong đó app.yaml sẽ có dạng như sau:

runtime: python38
entrypoint: python main.py

Ví dụ này yêu cầu cụ thể sử dụng máy chủ phát triển Flask thay vì gunicorn. Bạn cũng phải thêm mã khởi động máy chủ phát triển vào ứng dụng để khởi chạy trên giao diện 0.0.0.0 trên cổng 8080 bằng cách thêm phần nhỏ này vào cuối main.py:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

Tìm hiểu thêm về entrypoint trên trang tài liệu của công cụ này. Bạn có thể xem thêm các ví dụ và phương pháp hay nhất trong tài liệu khởi động App Engine Standard cũng như tài liệu khởi động App Engine linh hoạt.

Xoá appengine_config.pylib

Xoá tệp appengine_config.py và thư mục lib. Khi di chuyển sang Python 3, App Engine sẽ nhận và cài đặt các gói có trong requirements.txt.

Tệp cấu hình appengine_config.py được dùng để nhận dạng các thư viện/gói của bên thứ ba, cho dù bạn tự sao chép chúng hay sử dụng những thư viện/gói đã có trên máy chủ App Engine (được tích hợp sẵn). Khi chuyển sang Python 3, bạn cần lưu ý những thay đổi lớn sau đây:

  1. Không được kết hợp các thư viện của bên thứ ba đã sao chép (được liệt kê trong requirements.txt)
  2. Không có pip install nào trong thư mục lib, tức là không có thư mục lib nào
  3. Không có thư viện tích hợp sẵn của bên thứ ba trong app.yaml
  4. Không cần tham chiếu ứng dụng đến các thư viện bên thứ ba, nên không có tệp appengine_config.py

Bạn chỉ cần liệt kê tất cả các thư viện bắt buộc của bên thứ ba trong requirements.txt.

Triển khai ứng dụng

Triển khai lại ứng dụng để đảm bảo ứng dụng hoạt động. Bạn cũng có thể xác nhận mức độ gần giống giữa giải pháp của bạn với mã Python 3 mẫu của Mô-đun 2. Để hình dung sự khác biệt với Python 2, hãy so sánh mã với phiên bản Python 2 của mã đó.

Chúc mừng bạn đã hoàn thành bước thưởng trong Mô-đun 2! Hãy xem tài liệu về cách chuẩn bị tệp cấu hình cho thời gian chạy Python 3. Cuối cùng, hãy xem trang Tóm tắt/Dọn dẹp (trước đó) để biết các bước tiếp theo và cách dọn dẹp.

Chuẩn bị đơn đăng ký của bạn

Khi đến thời điểm di chuyển ứng dụng của bạn, bạn sẽ phải chuyển main.py và các tệp ứng dụng khác sang phiên bản 3.x. Vì vậy, phương pháp hay nhất là cố gắng hết sức để ứng dụng 2.x của bạn có khả năng "tương thích về sau" càng nhiều càng tốt.

Có rất nhiều tài nguyên trực tuyến giúp bạn thực hiện việc đó, nhưng một số mẹo chính là:

  1. Đảm bảo tất cả các phần phụ thuộc của ứng dụng đều hoàn toàn tương thích với phiên bản 3.x
  2. Đảm bảo ứng dụng của bạn chạy trên phiên bản ít nhất là 2.6 (tốt nhất là 2.7)
  3. Đảm bảo ứng dụng vượt qua toàn bộ bộ kiểm thử (và có độ bao phủ tối thiểu là 80%)
  4. Sử dụng các thư viện tương thích như six, Future và/hoặc Modernize
  5. Tìm hiểu về những điểm khác biệt chính giữa phiên bản 2.x và 3.x không tương thích ngược
  6. Mọi hoạt động I/O đều có thể dẫn đến sự không tương thích giữa Unicode và chuỗi byte

Ứng dụng mẫu được thiết kế với tất cả những điều này trong tâm trí, do đó, ứng dụng chạy trên 2.x và 3.x ngay khi xuất xưởng để chúng ta có thể tập trung vào việc cho bạn thấy những gì cần thay đổi để sử dụng nền tảng thế hệ tiếp theo.

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 1 (BẮT ĐẦU) và Mô-đu-le 2 (KẾT THÚC) 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ữ cho tất cả các hoạt động di chuyển codelab App Engine. 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 1

code

(không áp dụng)

Mô-đun 2

code

code

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: