Tóm tắt
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách triển khai một ứng dụng web Python Flask vào môi trường linh hoạt của App Engine. Ứng dụng ví dụ cho phép người dùng tải ảnh khuôn mặt của một người lên và tìm hiểu xem người đó có khả năng vui vẻ đến mức nào. Ứng dụng này sử dụng các API Google Cloud cho Vision, Storage và Datastore.
Giới thiệu về App Engine
Các ứng dụng Google App Engine rất dễ tạo, dễ duy trì và dễ mở rộng khi nhu cầu về lưu lượng truy cập và lưu trữ dữ liệu của bạn thay đổi. Với App Engine, bạn không cần phải bảo trì máy chủ. Bạn chỉ cần tải ứng dụng lên là có thể sử dụng ngay.
Các ứng dụng App Engine tự động mở rộng quy mô dựa trên lưu lượng truy cập đến. Cân bằng tải, các dịch vụ vi mô, uỷ quyền, cơ sở dữ liệu SQL và NoSQL, phân chia lưu lượng truy cập, ghi nhật ký, tìm kiếm, kiểm soát phiên bản, triển khai và khôi phục, cũng như quét bảo mật đều được hỗ trợ nguyên bản và có khả năng tuỳ chỉnh cao.
Môi trường linh hoạt của App Engine hỗ trợ tất cả các ngôn ngữ lập trình sau: C#, Go, Java, Node.js, PHP, Python và Ruby. App Engine Flexible chạy ứng dụng của bạn trong các vùng chứa Docker chạy trên máy ảo Google Compute Engine. Môi trường tiêu chuẩn của App Engine là một lựa chọn thay thế cho một số ngôn ngữ, bao gồm cả Python. App Engine Standard chạy ứng dụng của bạn trong một môi trường hộp cát hạn chế hơn. Hãy đọc bài viết Chọn một môi trường App Engine để biết thêm thông tin.
Kiến thức bạn sẽ học được
- Cách triển khai một ứng dụng web đơn giản vào Môi trường linh hoạt của App Engine
- Cách truy cập vào thư viện ứng dụng Google Cloud cho Vision, Storage và Datastore
- Cách sử dụng Google Cloud Console và Google Cloud SDK để quản lý nhiều tài nguyên trên đám mây
- Cách sử dụng Cloud Shell
Bạn cần có
- Làm quen với Python
- Làm quen với các trình chỉnh sửa văn bản tiêu chuẩn của Linux, chẳng hạn như Vim, Emacs hoặc Nano
Tạo dự án
Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển Google Cloud Platform (console.cloud.google.com) rồi tạo một dự án mới:



Hãy nhớ mã dự án, một tên duy nhất trong tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi đó là PROJECT_ID.
Thanh toán
Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.
Việc thực hiện lớp học lập trình này sẽ không tốn của bạn quá vài đô la, nhưng có thể tốn nhiều hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để các tài nguyên đó chạy.
Người dùng mới của Google Cloud Platform đủ điều kiện dùng thử miễn phí 300 USD.
Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên đám mây. Máy ảo dựa trên Debian này được trang bị tất cả các công cụ phát triển mà bạn cần (gcloud, python, virtualenv, pip và nhiều công cụ khác), cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Điều này có nghĩa là bạn chỉ cần một trình duyệt (có, trình duyệt này hoạt động trên Chromebook) cho lớp học lập trình này.
Để kích hoạt Google Cloud Shell, trong bảng điều khiển dành cho nhà phát triển, bạn chỉ cần nhấp vào nút ở phía trên cùng bên phải (mất vài giây để cung cấp và kết nối với môi trường):


Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành PROJECT_ID:
gcloud auth list Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project [core] Project = <PROJECT_ID>
Nếu vì lý do nào đó mà dự án chưa được thiết lập, bạn chỉ cần đưa ra lệnh sau:
gcloud config set project <PROJECT_ID>
Bạn đang tìm PROJECT_ID? Kiểm tra Mã dự án mà bạn đã dùng trong các bước thiết lập hoặc tra cứu mã này trong trang tổng quan của bảng điều khiển:

Trong Cloud Shell trên dòng lệnh, hãy chạy lệnh sau để sao chép kho lưu trữ Github:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Thay đổi thư mục thành python-docs-samples/codelabs/flex_and_vision:
cd python-docs-samples/codelabs/flex_and_vision
Trước khi có thể bắt đầu sử dụng API Vision, Storage và Datastore, bạn phải bật các API này bằng các lệnh sau:
gcloud services enable vision.googleapis.com
gcloud services enable storage-component.googleapis.com
gcloud services enable datastore.googleapis.com
Để đưa ra yêu cầu cho các API Vision, Storage và Datastore, bạn sẽ cần thông tin đăng nhập tài khoản dịch vụ. Bạn có thể tạo thông tin đăng nhập tài khoản dịch vụ từ dự án của mình bằng công cụ gcloud.
Đặt một biến môi trường cho PROJECT_ID, thay thế [YOUR_PROJECT_ID] bằng mã dự án của riêng bạn:
export PROJECT_ID=[YOUR_PROJECT_ID]
Tạo Tài khoản dịch vụ để truy cập vào các API của Google Cloud khi kiểm thử cục bộ:
gcloud iam service-accounts create codelab \ --display-name "My Codelab Service Account"
Cấp cho Tài khoản dịch vụ mới tạo các quyền thích hợp:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:codelab@${PROJECT_ID}.iam.gserviceaccount.com \
--role roles/ownerSau khi tạo Tài khoản dịch vụ, hãy tạo khoá Tài khoản dịch vụ:
gcloud iam service-accounts keys create ~/key.json \
--iam-account codelab@${PROJECT_ID}.iam.gserviceaccount.comLệnh này sẽ tạo một khoá tài khoản dịch vụ được lưu trữ trong tệp JSON có tên là key.json trong thư mục gốc của bạn.
Sử dụng đường dẫn tuyệt đối của khoá đã tạo, hãy đặt một biến môi trường cho khoá tài khoản dịch vụ của bạn trong Cloud Shell:
export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"Bạn có thể đọc thêm về cách xác thực Vision API.
Bắt đầu môi trường ảo và cài đặt các phần phụ thuộc
Tạo một môi trường Python 3 riêng biệt có tên là env bằng virtualenv:
virtualenv -p python3 env
Nhập virtualenv mới tạo có tên là env:
source env/bin/activate
Sử dụng pip để cài đặt các phần phụ thuộc cho dự án của bạn từ tệp requirements.txt:
pip install -r requirements.txt
Tệp requirements.txt là danh sách các phần phụ thuộc của gói mà bạn cần cho dự án của mình. Lệnh trên đã tải tất cả các phần phụ thuộc gói được liệt kê này xuống virtualenv.
Tạo một ứng dụng App Engine
Tiếp theo, hãy tạo một phiên bản App Engine bằng cách sử dụng:
gcloud app createTạo bộ chứa Storage
Trước tiên, hãy đặt biến môi trường CLOUD_STORAGE_BUCKET bằng tên của PROJECT_ID. (Bạn nên đặt tên cho nhóm theo PROJECT_ID để thuận tiện).
export CLOUD_STORAGE_BUCKET=${PROJECT_ID}Ứng dụng của chúng tôi sử dụng một bộ chứa Cloud Storage. Bạn sẽ cần tạo bộ chứa này từ Cloud Shell bằng một công cụ có tên là gsutil. Chạy lệnh sau đây để tạo một nhóm có cùng tên với PROJECT_ID của bạn.
gsutil mb gs://${PROJECT_ID}Chạy ứng dụng
python main.py
Sau khi ứng dụng khởi động, hãy nhấp vào biểu tượng Xem trước trên web
trong thanh công cụ Cloud Shell rồi chọn "Xem trước trên cổng 8080".

Một thẻ trong trình duyệt sẽ mở ra và kết nối với máy chủ mà bạn vừa khởi động. Bạn sẽ thấy như sau:

Hãy thử tải một bức ảnh có khuôn mặt người lên. Nhấp vào nút Chọn tệp, chọn một hình ảnh trên máy tính rồi nhấp vào Gửi.
Sau khi tải ảnh lên, bạn sẽ thấy nội dung tương tự như sau:

Bố cục mã mẫu
Mẫu này có bố cục như sau:
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
Tệp Python này là một ứng dụng web Flask. Ứng dụng này cho phép người dùng gửi ảnh (tốt nhất là ảnh khuôn mặt), được lưu trữ trong Cloud Storage và phân tích bằng tính năng phát hiện khuôn mặt của Cloud Vision API. Thông tin chính về mỗi bức ảnh được lưu trữ trong Datastore, cơ sở dữ liệu NoSQL của Google Cloud Platform, nơi thông tin này được truy cập mỗi khi người dùng truy cập vào trang web.
Ứng dụng này sử dụng các thư viện ứng dụng Google Cloud Platform cho Storage, Datastore và Vision. Các thư viện ứng dụng này giúp bạn dễ dàng truy cập vào các API của Cloud bằng ngôn ngữ lập trình mà bạn yêu thích.
Hãy cùng xem một số đoạn mã chính.
Phần nhập ở trên cùng là nơi chúng ta nhập các gói cần thiết cho mã của mình. Đây là cách chúng tôi nhập các thư viện ứng dụng Google Cloud cho Datastore, Storage và Vision:
from google.cloud import datastore
from google.cloud import storage
from google.cloud import visionSau đây là mã cho những gì xảy ra khi người dùng truy cập vào URL gốc của trang web. Chúng ta tạo một đối tượng ứng dụng Datastore, được dùng để truy cập vào thư viện ứng dụng Datastore. Sau đó, chúng ta sẽ chạy một truy vấn trên Datastore cho các thực thể thuộc loại Faces. Cuối cùng, chúng ta sẽ kết xuất mẫu HTML, truyền image_entities mà chúng ta trích xuất từ Datastore dưới dạng một biến.
@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)Hãy xem cách thực thể được lưu vào Datastore. Datastore là giải pháp cơ sở dữ liệu NoSQL của Google Cloud. Dữ liệu được lưu trữ trong các đối tượng gọi là thực thể. Mỗi thực thể được chỉ định một khoá nhận dạng duy nhất. Bạn có thể tạo khoá này bằng cách sử dụng một loại và một chuỗi tên khoá. Loại là một nhóm tổ chức cho biết loại thực thể. Ví dụ: chúng ta có thể muốn thiết lập các loại cho Ảnh, Con người và Động vật.
Mỗi thực thể có thể có nhiều thuộc tính do nhà phát triển xác định. Các thuộc tính này có thể có giá trị thuộc nhiều loại, bao gồm số nguyên, số thực, chuỗi, ngày hoặc dữ liệu nhị phân.
# 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)Bạn có thể truy cập vào các thư viện ứng dụng Storage và Vision theo cách lập trình tương tự như Datastore. Bạn có thể tự mở tệp main.py bằng vim, emacs hoặc nano để khám phá tất cả mã mẫu.
Tìm hiểu thêm về Flask tại http://flask.pocoo.org/.
Tìm hiểu thêm về Thư viện ứng dụng tại https://googlecloudplatform.github.io/google-cloud-python/.
homepage.html
Khung web Flask tận dụng Jinja2 làm công cụ mẫu. Điều này cho phép chúng ta truyền các biến và biểu thức từ main.py vào homepage.html. Các biến và biểu thức này sẽ được thay thế bằng các giá trị sau khi trang được kết xuất.
Tìm hiểu thêm về Jinja2 tại http://jinja.pocoo.org/docs/2.9/templates/.
Mẫu HTML Jinja2 này hiển thị một biểu mẫu để người dùng gửi ảnh vào cơ sở dữ liệu. Ứng dụng này cũng hiển thị từng hình ảnh đã gửi trước đó cùng với tên tệp, ngày/giờ tải lên và khả năng khuôn mặt do Vision API phát hiện là khuôn mặt vui vẻ.
homepage.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 linh hoạt sử dụng một tệp có tên là app.yaml để mô tả cấu hình triển khai của một ứng dụng. Nếu không có tệp này, App Engine sẽ cố gắng đoán cấu hình triển khai. Tuy nhiên, bạn nên cung cấp tệp này.
Tiếp theo, bạn sẽ sửa đổi app.yaml bằng trình chỉnh sửa mà bạn chọn vim, nano hoặc emacs. Chúng ta sẽ sử dụng trình chỉnh sửa nano:
nano app.yamlapp.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>Đây là cấu hình cơ bản cần thiết để triển khai ứng dụng Python 3 App Engine linh hoạt. Bạn có thể tìm hiểu thêm về cách định cấu hình App Engine tại đây.
Sau khi mở app.yaml, hãy thay thế < your-cloud-storage-bucket > bằng tên của bộ chứa Cloud Storage. (Nếu bạn quên tên của nhóm Cloud Storage, hãy sao chép Mã dự án GCP từ Qwiklabs (mã này giống nhau)). Phần env_variables thiết lập các biến môi trường sẽ được dùng trong main.py sau khi ứng dụng được triển khai.
Bây giờ, bạn có thể lưu và đóng tệp trong nano bằng cách sử dụng tổ hợp phím (Ctrl + x). Thao tác này sẽ nhắc bạn:

Nhập chữ cái y rồi nhấn phím ENTER thêm một lần nữa để xác nhận tên tệp cho lời nhắc sau:

Triển khai ứng dụng của bạn trên App Engine bằng cách sử dụng gcloud:
gcloud app deploySau khi triển khai ứng dụng, bạn có thể truy cập ứng dụng bằng cách mở URL https://< PROJECT_ID >.appspot.com trong trình duyệt web.
Tóm tắt
Trong bước này, bạn sẽ thiết lập một ứng dụng web Python và triển khai ứng dụng đó vào môi trường linh hoạt của App Engine.
Bạn đã tìm hiểu cách viết và triển khai ứng dụng web linh hoạt đầu tiên trên App Engine!
Dọn dẹp
Để tránh phát sinh phí cho tài khoản Google Cloud Platform của bạn đối với các tài nguyên được dùng trong hướng dẫn nhanh này, hãy làm như sau:
- Chuyển đến Cloud Platform Console.
- Chọn dự án mà bạn muốn tắt, sau đó nhấp vào "Xoá" ở trên cùng: thao tác này sẽ lên lịch xoá dự án.
Tìm hiểu thêm
- Python trên Google Cloud Platform: https://cloud.google.com/python/
- Tài liệu về App Engine linh hoạt cho Python: https://cloud.google.com/appengine/docs/flexible/python/
- Tài liệu về Thư viện ứng dụng Python: Datastore, Storage và Vision
- Các mẫu mã Python khác: https://cloud.google.com/python/samples
Giấy phép
Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả theo Creative Commons 2.0.