Triển khai ứng dụng web Python Flask cho môi trường linh hoạt của App Engine

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 ứng dụng web Python Flask với môi trường linh hoạt của App Engine. Ứng dụng mẫu 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 khả năng người đó cảm thấy hài lòng. Ứng dụng này sử dụng các API Google Cloud cho Tầm nhìn, Bộ nhớ và Kho dữ liệu.

Giới thiệu về App Engine

Các ứng dụng Google App Engine rất dễ tạo, dễ bảo trì và dễ mở rộng khi lưu lượng truy cập và bộ nhớ dữ liệu của bạn cần thay đổi. Với App Engine, không có máy chủ nào để duy trì. Bạn chỉ cần tải ứng dụng của mình lên và ứng dụng đã sẵn sàng hoạt động.

Ứng dụng App Engine tự động mở rộng dựa trên lưu lượng truy cập đến. Cân bằng tải, dịch vụ vi mô, ủy quyền, cơ sở dữ liệu SQL và NoSQL, phân tách lưu lượng truy cập, ghi nhật ký, tìm kiếm, tạo 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ợ riêng và có thể tùy 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 Flex 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 tùy chọn thay thế cho một số ngôn ngữ nhất định, bao gồm cả Python. App Engine Standard chạy ứng dụng của bạn trong môi trường hộp cát hạn chế hơn. Hãy đọc bài viết Chọn 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 ứng dụng web đơn giản cho Môi trường linh hoạt của App Engine
  • Cách truy cập vào các thư viện ứng dụng của Google Cloud dành cho Vision, Storage và Datastore
  • Cách sử dụng Google Cloud Console và Google Cloud SDK để quản lý các tài nguyên đám mây khác nhau
  • Cách sử dụng Cloud Shell

Bạn cần có

  • Làm quen với Python
  • Quen thuộc với các trình chỉnh sửa văn bản Linux tiêu chuẩn, 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), thì bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển của Google Cloud Platform (console.cloud.google.com) và tạo một dự án mới:

Hãy ghi nhớ mã dự án, một tên duy nhất trên tất cả các dự án Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động cho bạn!). Lớp học này sẽ được gọi sau này trong lớp học lập trình này là PROJECT_ID.

Thanh toán

Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.

Nếu tham gia lớp học lập trình này, bạn sẽ không mất quá vài đô la, nhưng có thể sẽ hiệu quả 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ử 300 đô la dùng thử miễn phí.

Mặc dù Google Cloud có thể hoạt động từ xa máy tính xách tay của bạn, nhưng trong lớp học lập trình này, chúng ta sẽ dùng Google Cloud Shell, một môi trường dòng lệnh chạy trong Cloud. Máy ảo dựa trên Debian này được tải bằng tất cả các công cụ phát triển mà bạn cần (gcloud, python, Virtualenv, pip và các công cụ khác), máy này cung cấp thư mục gốc 5GB cố định và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và xác thực mạng. Điều này có nghĩa là tất cả những gì bạn cần cho lớp học lập trình này là trình duyệt (có, nó hoạt động trên Chromebook).

Để kích hoạt Google Cloud Shell, từ 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 (chỉ mất vài phút để cấp phép và kết nối với môi trường):

Sau khi kết nối với shell Cloud, bạn sẽ thấy rằng bạn đã được xác thực và dự án này đã được đặt thành PROJECT_ID của bạn:

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 đặt, bạn chỉ cần đưa ra lệnh sau:

gcloud config set project <PROJECT_ID>

Bạn đang tìm PROJECT_ID của mình? Hãy xem 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 trên 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 chúng tôi có thể bắt đầu sử dụng API Tầm nhìn, Bộ nhớ và Lưu trữ dữ liệu, bạn phải bật API 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

Để có thể gửi yêu cầu đến các API Tầm nhìn, Bộ nhớ và Lưu trữ dữ liệu, bạn cần có thông tin đăng nhập của 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ách sử dụng công cụ gcloud.

Đặ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 API Google Cloud khi thử nghiệm trên máy:

gcloud iam service-accounts create codelab \
  --display-name "My Codelab Service Account"

Cấp các quyền thích hợp mới tạo cho Tài khoản dịch vụ:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:codelab@${PROJECT_ID}.iam.gserviceaccount.com \
--role roles/owner

Sau khi tạo Tài khoản dịch vụ, hãy tạo một khóa Tài khoản dịch vụ:

gcloud iam service-accounts keys create ~/key.json \
--iam-account codelab@${PROJECT_ID}.iam.gserviceaccount.com

Lệnh này tạo một khóa tài khoản dịch vụ được lưu trữ trong một 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 khóa được tạo, đặt biến môi trường cho khóa 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 API Vision.

Bắt đầu môi trường ảo và cài đặt phần phụ thuộc

Tạo môi trường Python 3 tách biệt có tên là env bằng ảoenv:

virtualenv -p python3 env

Nhập enenv mới được tạo có tên 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à một danh sách các phần phụ thuộc vào 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 vào gói được liệt kê này xuống tệp Virtualenv.

Tạo ứ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 create

Tạo bộ chứa lưu trữ

Trước tiên, hãy đặt biến môi trường CLOUD_STORAGE_BUCKET bằng tên của PROJECT_ID. (Thông thường, bạn nên đặt tên cho bộ chứa giống như với PROJECT_ID nhằm mục đích thuận tiện).

export CLOUD_STORAGE_BUCKET=${PROJECT_ID}

Ứng dụng của chúng tôi sử dụng bộ chứa Cloud Storage mà bạn sẽ cần tạo từ Cloud Shell bằng một công cụ có tên là gsutil. Chạy lệnh sau, lệnh này sẽ 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ủ bạn vừa khởi động. Bạn sẽ thấy như sau:

Ảnh chụp màn hình lúc 7.22.50 PM.png 2017-02-23

Hãy thử tải một ảnh có chứa khuôn mặt người. 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 những thông tin như sau:

Ảnh chụp màn hình lúc 7.32.08 PM.2017-02-23

Bố cục mã mẫu

Mẫu có bố cục 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à ứ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à 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 API Cloud Vision. Thông tin chính về từng ảnh được lưu trữ trong Datastore, cơ sở dữ liệu NoSQL của Google Cloud Platform, nơi dữ liệu đượ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 Bộ nhớ, Kho dữ liệu và Tầm nhìn. 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 Cloud từ các ngôn ngữ lập trình mà bạn yêu thích.

Hãy xem một số đoạn mã chính của mã.

Phần nhập ở trên cùng là nơi chúng tôi nhập các gói mà chúng tôi cần cho mã của mình. Sau đây là cách chúng tôi nhập thư viện ứng dụng Google Cloud cho Datastore, Bộ nhớ và Tầm nhìn:

from google.cloud import datastore
from google.cloud import storage
from google.cloud import vision

Đây là mã cho những gì xảy ra khi người dùng truy cập URL gốc của trang web. Chúng ta tạo một đối tượng máy khách Datastore, dùng để truy cập vào thư viện ứng dụng Datastore. Sau đó, chúng ta 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 hiển thị mẫu HTML, chuyển vào image_entities mà chúng ta trích xuất từ Datastore ở dạng 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 có tên là thực thể. Mỗi thực thể được gán một khóa nhận dạng duy nhất, có thể tạo bằng cách sử dụng loại và chuỗi tên khóa. Loại là một nhóm tổ chức cho loại thực thể thuộc loại đó. Ví dụ: chúng ta có thể muốn thiết lập loại đối với Photos, Mọi người và Động vật.

Mỗi entity có thể có nhiều thuộc tính do nhà phát triển xác định, có thể có các giá trị thuộc một số 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 Lưu trữ và Tầm nhìn theo cách tương tự như với Datastore. Bạn có thể tự mở tệp main.py bằng cách sử dụ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/.

trang chủ.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 chuyển các biến và biểu thức từ main.py vào homepage.html sẽ được thay thế bằng các giá trị sau khi trang được hiển thị.

Tìm hiểu thêm về Jinja2 tại http://jinja.pocoo.org/docs/2.9/template/.

Mẫu HTML Jinja2 này hiển thị một biểu mẫu để người dùng gửi ảnh đến cơ sở dữ liệu. Tính nă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 được phát hiện qua API Vision là hợp lệ.

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 Flex 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 tôi sẽ sử dụng trình chỉnh sửa nano:

nano app.yaml

app.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 Flex. 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 bạn mở app.yaml, hãy thay thế < your-cloud-storage- nhộn > bằng tên bộ chứa Cloud Storage của bạn. (Nếu bạn quên tên bộ chứa Cloud Storage, hãy sao chép Mã dự án GCP từ Qwiklabs (giống nhau). Phần env_variables thiết lập các biến môi trường sẽ dùng trong main.py sau khi triển khai ứng dụng.

Giờ đây, bạn có thể đóng trang để lưu và đóng tệp theo nano bằng cách sử dụng (Ctrl + x), thao tác này sẽ nhắc:

Ảnh chụp màn hình lúc 4:47.12 chiều.png 2017-02-17

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

Ảnh chụp màn hình lúc 4:18,23 chiều ngày 24/02/2017

Triển khai ứng dụng của bạn trên App Engine bằng cách sử dụng gcloud:

gcloud app deploy

Sau 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 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 cho App Engine!

Dọn dẹp

Cách tránh bị tính phí phát sinh cho tài khoản Google Cloud Platform đối với các tài nguyên dùng trong bước khởi động nhanh này:

Tìm hiểu thêm

Giấy phép

Tài liệu này được cấp phép theo Giấy phép chung Creative Commons 2.0.