1. ภาพรวม
ชุด Codelab นี้ (บทแนะนำแบบลงมือปฏิบัติด้วยตนเอง) มีจุดมุ่งหมายเพื่อช่วยให้นักพัฒนาแอป Google App Engine (สภาพแวดล้อมมาตรฐาน) ปรับปรุงแอปให้ทันสมัยโดยแนะนำขั้นตอนการย้ายข้อมูลต่างๆ ขั้นตอนที่สำคัญที่สุดคือการเลิกใช้บริการที่มาพร้อมกับรันไทม์เดิม เนื่องจากรันไทม์รุ่นถัดไปมีความยืดหยุ่นมากกว่า ทำให้ผู้ใช้มีตัวเลือกบริการที่หลากหลายมากขึ้น การย้ายไปใช้รันไทม์รุ่นใหม่กว่าจะช่วยให้คุณผสานรวมกับผลิตภัณฑ์ Google Cloud ได้ง่ายขึ้น ใช้บริการที่รองรับได้หลากหลายมากขึ้น และรองรับการเปิดตัวภาษาในปัจจุบัน
บทแนะนำที่ไม่บังคับนี้จะแสดงให้นักพัฒนาซอฟต์แวร์เห็นวิธีย้ายข้อมูลจาก Cloud NDB ไปยัง Cloud Datastore เป็นไลบรารีของไคลเอ็นต์เพื่อสื่อสารกับบริการ Datastore นักพัฒนาแอปที่ต้องการใช้ NDB ต่อไปก็สามารถทำได้เนื่องจากเข้ากันได้กับ Python 3 การย้ายข้อมูลนี้จึงเป็นแบบไม่บังคับ การย้ายข้อมูลนี้มีไว้สำหรับผู้ที่ต้องการสร้างโค้ดเบสที่สอดคล้องกันและไลบรารีที่แชร์กับแอปอื่นๆ ที่ใช้ Cloud Datastore อยู่แล้วเท่านั้น ซึ่งอธิบายไว้ในส่วน "เบื้องหลัง"
คุณจะได้เรียนรู้วิธีต่อไปนี้
- ใช้ Cloud NDB (หากคุณไม่คุ้นเคย)
- ย้ายข้อมูลจาก Cloud NDB ไปยัง Cloud Datastore
- ย้ายข้อมูลแอปไปยัง Python 3 ต่อไป
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud Platform ที่มีบัญชีสำหรับการเรียกเก็บเงิน GCP ที่ใช้งานอยู่
- ทักษะ Python ขั้นพื้นฐาน
- มีความรู้พื้นฐานเกี่ยวกับคำสั่ง Linux ขั้นพื้นฐาน
- ความรู้พื้นฐานเกี่ยวกับการพัฒนาและทำให้แอป App Engine ใช้งานได้
- แอป App Engine 2.x หรือ 3.x โมดูล 2 ที่ใช้งานได้
แบบสำรวจ
คุณจะใช้ Codelab นี้อย่างไร
2. ฉากหลัง
แม้ว่า Cloud NDB จะเป็นโซลูชันพื้นที่เก็บข้อมูลที่ยอดเยี่ยมสำหรับนักพัฒนาแอป App Engine มาอย่างยาวนาน และช่วยในการเปลี่ยนไปใช้ Python 3 แต่ก็ไม่ใช่เพียงวิธีเดียวที่นักพัฒนาแอป App Engine จะเข้าถึงพื้นที่เก็บข้อมูลได้ เมื่อ Datastore ของ App Engine กลายเป็นผลิตภัณฑ์ของตัวเองในปี 2013 Google ได้สร้าง Cloud Datastore ซึ่งเป็นไลบรารีของไคลเอ็นต์ใหม่เพื่อให้ผู้ใช้ทั้งหมดใช้ Datastore ได้
ระบบจะนำนักพัฒนาแอป Python 3 App Engine และนักพัฒนาแอปที่ไม่ใช่ App Engine ไปใช้ Cloud Datastore (ไม่ใช่ Cloud NDB) เราขอแนะนำให้นักพัฒนาแอป App Engine ที่ใช้ Python 2 ย้ายข้อมูลจาก ndb ไปยัง Cloud NDB และพอร์ตไปยัง Python 3 จากที่นั่น แต่คุณก็เลือกที่จะย้ายข้อมูลไปยัง Cloud Datastore ต่อได้เช่นกัน นี่เป็นการตัดสินใจที่สมเหตุสมผล โดยเฉพาะอย่างยิ่งสำหรับนักพัฒนาซอฟต์แวร์ที่มีโค้ดที่ใช้ Cloud Datastore อยู่แล้ว เช่น โค้ดที่เพิ่งกล่าวถึง และต้องการสร้างไลบรารีที่แชร์ในแอปพลิเคชันทั้งหมด การนำโค้ดกลับมาใช้ใหม่เป็นแนวทางปฏิบัติแนะนำเช่นเดียวกับความสอดคล้องของโค้ด และทั้ง 2 อย่างนี้ช่วยลดต้นทุนการบำรุงรักษาโดยรวม ดังที่สรุปไว้ที่นี่
การย้ายข้อมูลจาก Cloud NDB ไปยัง Cloud Datastore
- ช่วยให้นักพัฒนาซอฟต์แวร์มุ่งเน้นที่ฐานของโค้ดเดียวสำหรับการเข้าถึง Datastore
- หลีกเลี่ยงการดูแลโค้ดบางส่วนโดยใช้ Cloud NDB และโค้ดอื่นๆ โดยใช้ Cloud Datastore
- ช่วยให้ฐานของโค้ดมีความสอดคล้องกันมากขึ้นและนำโค้ดกลับมาใช้ซ้ำได้ดียิ่งขึ้น
- ช่วยให้ใช้ไลบรารีทั่วไป/ที่ใช้ร่วมกันได้ ซึ่งจะช่วยลดต้นทุนการบำรุงรักษาโดยรวม
การย้ายข้อมูลนี้มีขั้นตอนหลักๆ ดังนี้
- การตั้งค่า/การเตรียมการ
- แทนที่ Cloud NDB ด้วยไลบรารีของไคลเอ็นต์ Cloud Datastore
- อัปเดตแอปพลิเคชัน
3. การตั้งค่า/การเตรียมการ
ก่อนที่จะไปที่ส่วนหลักของบทแนะนำนี้ เรามาตั้งค่าโปรเจ็กต์ รับโค้ด แล้วจึงติดตั้งใช้งานแอปพื้นฐานเพื่อให้ทราบว่าเราเริ่มต้นด้วยโค้ดที่ใช้งานได้
1. ตั้งค่าโปรเจ็กต์
หากคุณทำ Codelab โมดูลที่ 2 เสร็จแล้ว เราขอแนะนำให้ใช้โปรเจ็กต์ (และโค้ด) เดียวกันนั้นซ้ำ หรือจะสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์อื่นที่มีอยู่ซ้ำก็ได้ ตรวจสอบว่าโปรเจ็กต์มีบัญชีสำหรับการเรียกเก็บเงินที่ใช้งานอยู่และเปิดใช้ App Engine (แอป) แล้ว
2. รับแอปตัวอย่างพื้นฐาน
ข้อกำหนดเบื้องต้นอย่างหนึ่งคือต้องมีแอปตัวอย่างของโมดูล 2 ที่ใช้งานได้ หากทำตามบทแนะนำนั้นจนเสร็จแล้ว ให้ใช้โซลูชันของคุณ คุณสามารถทำแบบทดสอบนี้ได้เลย (ลิงก์ด้านบน) หรือหากต้องการข้าม ให้คัดลอกที่เก็บโมดูลที่ 2 (ลิงก์ด้านล่าง)
ไม่ว่าคุณจะใช้โค้ดของคุณเองหรือโค้ดของเรา เราจะเริ่มที่โค้ดของโมดูลที่ 2 Codelab โมดูลที่ 3 นี้จะแนะนำแต่ละขั้นตอนให้คุณ และเมื่อทำเสร็จแล้ว โค้ดควรมีลักษณะคล้ายกับโค้ดที่จุดสิ้นสุด บทแนะนำนี้มีเวอร์ชัน Python 2 และ 3 ดังนั้นโปรดดาวน์โหลดที่เก็บโค้ดที่ถูกต้องด้านล่าง
Python 2
- เริ่ม: โค้ดโมดูล 2
- เสร็จสิ้น: โค้ดโมดูล 3
- ที่เก็บทั้งหมด (โคลนหรือดาวน์โหลด ZIP)
ไดเรกทอรีของไฟล์เริ่มต้นของโมดูลที่ 2 ของ Python 2 (ของคุณหรือของเรา) ควรมีลักษณะดังนี้
$ ls
README.md appengine_config.py requirements.txt
app.yaml main.py templates
หากทำตามบทแนะนำโมดูลที่ 2 จนเสร็จ คุณจะมีโฟลเดอร์ lib ที่มี Flask และทรัพยากร Dependency ของ Flask ด้วย หากไม่มีโฟลเดอร์ lib ให้สร้างโฟลเดอร์ด้วยคำสั่ง pip install -t lib -r requirements.txt เพื่อให้เราสามารถติดตั้งใช้งานแอปพื้นฐานนี้ในขั้นตอนถัดไปได้ หากคุณติดตั้งทั้ง Python 2 และ 3 เราขอแนะนำให้ใช้ pip2 แทน pip เพื่อหลีกเลี่ยงความสับสนกับ Python 3
Python 3
- เริ่มต้น: ที่เก็บโมดูล 2
- เสร็จสิ้น: ที่เก็บโมดูล 3
- ที่เก็บทั้งหมด (โคลนหรือดาวน์โหลด ZIP)
ไดเรกทอรีของไฟล์เริ่มต้นของโมดูล 2 ของ Python 3 (ของคุณหรือของเรา) ควรมีลักษณะดังนี้
$ ls
README.md main.py templates
app.yaml requirements.txt
lib และ appengine_config.py ไม่ได้ใช้สำหรับ Python 3
3. (อีกครั้ง) ทำให้แอปโมดูล 2 ใช้งานได้
ขั้นตอนการเตรียมความพร้อมที่เหลือที่คุณต้องดำเนินการตอนนี้มีดังนี้
- ทบทวนความรู้เกี่ยวกับ
gcloudเครื่องมือบรรทัดคำสั่ง (หากจำเป็น) - (อีกครั้ง) ทำให้โค้ดของโมดูล 1 ใช้งานได้ใน App Engine (หากจำเป็น)
เมื่อคุณทำตามขั้นตอนเหล่านั้นเรียบร้อยแล้วและยืนยันว่าใช้งานได้ เราจะดำเนินการต่อในบทแนะนำนี้โดยเริ่มจากไฟล์การกำหนดค่า
4. แทนที่ Cloud NDB ด้วยไลบรารีของไคลเอ็นต์ Cloud Datastore
การเปลี่ยนแปลงการกำหนดค่าเพียงอย่างเดียวคือการสลับแพ็กเกจเล็กน้อยในไฟล์ requirements.txt
1. อัปเดต requirements.txt
เมื่อทำโมดูลที่ 2 เสร็จแล้ว ไฟล์ requirements.txt ของคุณจะมีลักษณะดังนี้
- ก่อน (Python 2 และ 3):
Flask==1.1.2
google-cloud-ndb==1.7.1
อัปเดต requirements.txt โดยแทนที่ไลบรารี Cloud NDB (google-cloud-ndb) ด้วยไลบรารี Cloud Datastore เวอร์ชันล่าสุด (google-cloud-datastore) โดยปล่อยให้รายการสำหรับ Flask เหมือนเดิม โปรดทราบว่า Cloud Datastore เวอร์ชันสุดท้ายที่เข้ากันได้กับ Python 2 คือ 1.15.3
- AFTER (Python 2):
Flask==1.1.2
google-cloud-datastore==1.15.3
- หลัง (Python 3):
Flask==1.1.2
google-cloud-datastore==2.1.0
โปรดทราบว่าเราจะดูแลที่เก็บข้อมูลเป็นประจำมากกว่าบทแนะนำนี้ ดังนั้นไฟล์ requirements.txt อาจแสดงเวอร์ชันใหม่กว่า เราขอแนะนำให้ใช้ไลบรารีแต่ละรายการในเวอร์ชันล่าสุด แต่หากใช้งานไม่ได้ คุณสามารถย้อนกลับไปใช้รุ่นเก่าได้ หมายเลขเวอร์ชันด้านบนเป็นเวอร์ชันล่าสุดเมื่อมีการอัปเดต Codelab นี้ครั้งล่าสุด
2. ไฟล์การกำหนดค่าอื่นๆ
ไฟล์การกำหนดค่าอื่นๆ app.yaml และ appengine_config.py ควรยังคงเหมือนเดิมจากขั้นตอนการย้ายข้อมูลก่อนหน้า
app.yamlควร (ยังคง) อ้างอิงแพ็กเกจที่รวมของบุคคลที่สามgrpcioและsetuptoolsappengine_config.pyควร (ยังคง) ชี้pkg_resourcesและgoogle.appengine.ext.vendorไปยังแหล่งข้อมูลของบุคคลที่สามในlib
ตอนนี้เรามาดูไฟล์แอปพลิเคชันกัน
5. อัปเดตไฟล์แอปพลิเคชัน
template/index.html จะไม่มีการเปลี่ยนแปลง แต่ main.py จะมีการอัปเดตเล็กน้อย
1. การนำเข้า
โค้ดเริ่มต้นสำหรับส่วนการนำเข้าควรมีลักษณะดังนี้
- ก่อน:
from flask import Flask, render_template, request
from google.cloud import ndb
แทนที่ google.cloud.ndb import ด้วย import สำหรับ Cloud Datastore: google.cloud.datastore เนื่องจากไลบรารีของไคลเอ็นต์ Datastore ไม่รองรับการสร้างฟิลด์การประทับเวลาในเอนทิตีโดยอัตโนมัติ ให้นำเข้าโมดูล datetime ของไลบรารีมาตรฐานเพื่อสร้างด้วยตนเองด้วย ตามธรรมเนียมแล้ว การนำเข้าไลบรารีมาตรฐานจะอยู่เหนือการนำเข้าแพ็กเกจของบุคคลที่สาม เมื่อทำการเปลี่ยนแปลงเหล่านี้เสร็จแล้ว ควรมีลักษณะดังนี้
- หลังจากนั้น
from datetime import datetime
from flask import Flask, render_template, request
from google.cloud import datastore
2. การเริ่มต้นและโมเดลข้อมูล
หลังจากเริ่มต้น Flask แล้ว แอปตัวอย่างของโมดูล 2 จะสร้างคลาสโมเดลข้อมูล NDB และฟิลด์ของคลาสดังกล่าวดังนี้
- ก่อน:
app = Flask(__name__)
ds_client = ndb.Client()
class Visit(ndb.Model):
visitor = ndb.StringProperty()
timestamp = ndb.DateTimeProperty(auto_now_add=True)
ไลบรารี Cloud Datastore ไม่มีคลาสดังกล่าว ดังนั้นให้ลบการประกาศคลาส Visit ออก คุณยังคงต้องมีไคลเอ็นต์เพื่อสื่อสารกับ Datastore ดังนั้นให้เปลี่ยน ndb.Client() เป็น datastore.Client() ไลบรารี Datastore มีความ "ยืดหยุ่น" มากกว่า ทำให้คุณสร้างเอนทิตีได้โดยไม่ต้อง "ประกาศล่วงหน้า" เกี่ยวกับโครงสร้างของเอนทิตีเหมือนกับ NDB หลังการอัปเดต ส่วนนี้ของ main.py ควรมีลักษณะดังนี้
- หลังจากนั้น
app = Flask(__name__)
ds_client = datastore.Client()
3. การเข้าถึง Datastore
การย้ายข้อมูลไปยัง Cloud Datastore ต้องมีการเปลี่ยนแปลงวิธีสร้าง จัดเก็บ และค้นหาเอนทิตี Datastore (ที่ระดับผู้ใช้) สําหรับแอปพลิเคชันของคุณ ความยากของการย้ายข้อมูลนี้ขึ้นอยู่กับความซับซ้อนของโค้ด Datastore ในแอปตัวอย่างของเรา เราพยายามทําให้อัปเดตได้ง่ายที่สุด นี่คือโค้ดเริ่มต้นของเรา
- ก่อน:
def store_visit(remote_addr, user_agent):
with ds_client.context():
Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
def fetch_visits(limit):
with ds_client.context():
return (v.to_dict() for v in Visit.query().order(
-Visit.timestamp).fetch_page(limit)[0])
เมื่อใช้ Cloud Datastore ให้สร้างเอนทิตีทั่วไปโดยระบุออบเจ็กต์ที่จัดกลุ่มไว้ในเอนทิตีด้วย "คีย์" สร้างระเบียนข้อมูลด้วยออบเจ็กต์ JSON (Python dict) ของคู่คีย์-ค่า จากนั้นเขียนลงใน Datastore ด้วย put() ที่คาดไว้ การค้นหาจะคล้ายกัน แต่ตรงไปตรงมามากขึ้นด้วย Datastore คุณจะเห็นว่าโค้ด Datastore ที่เทียบเท่าแตกต่างกันอย่างไร
- หลังจากนั้น
def store_visit(remote_addr, user_agent):
entity = datastore.Entity(key=ds_client.key('Visit'))
entity.update({
'timestamp': datetime.now(),
'visitor': '{}: {}'.format(remote_addr, user_agent),
})
ds_client.put(entity)
def fetch_visits(limit):
query = ds_client.query(kind='Visit')
query.order = ['-timestamp']
return query.fetch(limit=limit)
อัปเดตเนื้อหาฟังก์ชันสำหรับ store_visit() และ fetch_visits() ตามที่ระบุไว้ข้างต้น โดยให้ลายเซ็นเหมือนกับเวอร์ชันก่อนหน้า ไม่มีการเปลี่ยนแปลงใดๆ ในตัวแฮนเดิลหลัก root() หลังจากทำการเปลี่ยนแปลงเหล่านี้แล้ว ตอนนี้แอปของคุณพร้อมที่จะใช้ Cloud Datastore และพร้อมที่จะทดสอบแล้ว
6. สรุป/ล้างข้อมูล
ติดตั้งใช้งานแอปพลิเคชัน
นำแอปไปใช้งานอีกครั้งด้วย gcloud app deploy และยืนยันว่าแอปทำงานได้ ตอนนี้โค้ดของคุณควรตรงกับโค้ดในโฟลเดอร์ที่เก็บโมดูล 3 ดังนี้
หากคุณข้ามมาดูซีรีส์นี้โดยไม่ได้ทำ Codelab ก่อนหน้านี้ แอปจะไม่เปลี่ยนแปลง แต่จะลงทะเบียนการเข้าชมทั้งหมดในหน้าเว็บหลัก (/) และจะมีลักษณะดังนี้เมื่อคุณเข้าชมเว็บไซต์มากพอ

ขอแสดงความยินดีที่ทำ Codelab โมดูลที่ 3 นี้เสร็จสมบูรณ์ ตอนนี้คุณทราบแล้วว่าสามารถใช้ทั้งไลบรารีของไคลเอ็นต์ Cloud NDB และ Cloud Datastore เพื่อเข้าถึง Datastore ได้ การย้ายข้อมูลไปยังตัวเลือกหลังจะช่วยให้คุณได้รับประโยชน์จากคลังภาพที่แชร์ โค้ดทั่วไป และการนำโค้ดกลับมาใช้ใหม่เพื่อความสอดคล้องและลดต้นทุนในการบำรุงรักษา
ไม่บังคับ: ล้างข้อมูล
แล้วการล้างข้อมูลเพื่อหลีกเลี่ยงการเรียกเก็บเงินจนกว่าคุณจะพร้อมที่จะไปยัง Codelab การย้ายข้อมูลถัดไปล่ะ ในฐานะนักพัฒนาแอปที่มีอยู่ คุณน่าจะทราบข้อมูลราคาของ App Engine อยู่แล้ว
ไม่บังคับ: ปิดใช้แอป
หากยังไม่พร้อมที่จะไปยังบทแนะนำถัดไป ให้ปิดใช้แอปเพื่อหลีกเลี่ยงการเรียกเก็บเงิน เมื่อพร้อมที่จะไปที่ Codelab ถัดไป คุณก็เปิดใช้ฟีเจอร์นี้อีกครั้งได้ ขณะที่แอปถูกปิดใช้ แอปจะไม่ได้รับการเข้าชมใดๆ ที่จะทำให้เกิดค่าใช้จ่าย แต่สิ่งอื่นที่คุณอาจถูกเรียกเก็บเงินคือการใช้งาน Datastore หากเกินโควต้าฟรี ดังนั้นให้ลบข้อมูลให้เพียงพอเพื่อให้อยู่ในขีดจำกัดนั้น
ในทางกลับกัน หากคุณไม่ต้องการดำเนินการย้ายข้อมูลต่อและต้องการลบทุกอย่างออกทั้งหมด คุณสามารถปิดโปรเจ็กต์ได้
ขั้นตอนถัดไป
จากตรงนี้ คุณสามารถสำรวจโมดูลการย้ายข้อมูลถัดไปเหล่านี้ได้
- โบนัสโมดูลที่ 3: ไปที่ส่วนโบนัสเพื่อดูวิธีพอร์ตไปยัง Python 3 และรันไทม์ App Engine รุ่นถัดไป
- Module 7: คิวงานแบบพุชของ App Engine (ต้องระบุหากคุณใช้คิวงาน [push])
- เพิ่ม
taskqueueงานแบบพุชของ App Engine ไปยังแอปโมดูล 1 - เตรียมผู้ใช้ให้พร้อมสำหรับการย้ายข้อมูลไปยัง Cloud Tasks ในโมดูลที่ 8
- เพิ่ม
- Module 4: ย้ายข้อมูลไปยัง Cloud Run ด้วย Docker
- สร้างคอนเทนเนอร์แอปเพื่อเรียกใช้ใน Cloud Run ด้วย Docker
- ช่วยให้คุณใช้ Python 2 ต่อไปได้
- Module 5: ย้ายข้อมูลไปยัง Cloud Run ด้วย Cloud Buildpacks
- สร้างคอนเทนเนอร์ของแอปเพื่อเรียกใช้ใน Cloud Run ด้วย Cloud Buildpacks
- ไม่จำเป็นต้องมีความรู้เกี่ยวกับ Docker, คอนเทนเนอร์ หรือ
Dockerfile - คุณต้องย้ายข้อมูลแอปไปยัง Python 3 แล้ว
- Module 6: ย้ายข้อมูลไปยัง Cloud Firestore
- ย้ายข้อมูลไปยัง Cloud Firestore เพื่อเข้าถึงฟีเจอร์ของ Firebase
- แม้ว่า Cloud Firestore จะรองรับ Python 2 แต่ Codelab นี้ใช้ได้ใน Python 3 เท่านั้น
7. โบนัส: ย้ายข้อมูลไปยัง Python 3
เราขอแนะนำให้คุณย้ายข้อมูลไปยัง Python 3 เพื่อเข้าถึงรันไทม์และฟีเจอร์ล่าสุดของ App Engine ในแอปตัวอย่างของเรา Datastore เป็นบริการในตัวเพียงอย่างเดียวที่เราใช้ และเนื่องจากเราได้ย้ายข้อมูลจาก ndb ไปยัง Cloud NDB แล้ว ตอนนี้เราจึงสามารถพอร์ตไปยังรันไทม์ Python 3 ของ App Engine ได้
ภาพรวม
แม้ว่าการพอร์ตไปยัง Python 3 จะไม่อยู่ในขอบเขตของบทแนะนำของ Google Cloud แต่ส่วนนี้ของ Codelab จะช่วยให้นักพัฒนาซอฟต์แวร์ทราบถึงความแตกต่างของรันไทม์ของ Python 3 สำหรับ App Engine ฟีเจอร์ที่โดดเด่นอย่างหนึ่งของรันไทม์รุ่นถัดไปคือการเข้าถึงแพ็กเกจของบุคคลที่สามที่ง่ายขึ้น โดยไม่จำเป็นต้องระบุแพ็กเกจในตัวใน app.yaml หรือต้องคัดลอกหรืออัปโหลดไลบรารีที่ไม่ใช่ไลบรารีในตัว เนื่องจากระบบจะติดตั้งไลบรารีดังกล่าวโดยนัยจากการแสดงใน requirements.txt
เนื่องจากตัวอย่างของเราเป็นพื้นฐานและ Cloud Datastore เข้ากันได้กับ Python 2-3 จึงไม่จำเป็นต้องพอร์ตโค้ดแอปพลิเคชันไปยัง 3.x อย่างชัดเจน แอปจะทำงานใน 2.x และ 3.x โดยไม่มีการแก้ไข ซึ่งหมายความว่าการเปลี่ยนแปลงที่จำเป็นในกรณีนี้คือการกำหนดค่าเท่านั้น
- ลดความซับซ้อนของ
app.yamlเพื่ออ้างอิง Python 3 และนำการอ้างอิงไลบรารีของบุคคลที่สามที่รวมไว้ออก - ลบ
appengine_config.pyและโฟลเดอร์libเนื่องจากไม่จำเป็นอีกต่อไป
ไฟล์แอปพลิเคชัน main.py และ templates/index.html จะยังคงไม่มีการเปลี่ยนแปลง
อัปเดต requirements.txt
Cloud Datastore เวอร์ชันสุดท้ายที่รองรับ Python 2 คือ 1.15.3 อัปเดต requirements.txt โดยใช้เวอร์ชันล่าสุดสำหรับ Python 3 (อาจเป็นเวอร์ชันใหม่กว่านี้) ในขณะที่เขียนบทแนะนำนี้ เวอร์ชันล่าสุดคือ 2.1.0 ดังนั้นให้แก้ไขบรรทัดดังกล่าวให้มีลักษณะดังนี้ (หรือเวอร์ชันล่าสุด)
google-cloud-datastore==2.1.0
ลดรูป app.yaml
ก่อน:
การเปลี่ยนแปลงที่แท้จริงเพียงอย่างเดียวสำหรับแอปตัวอย่างนี้คือการย่อ app.yaml ให้สั้นลงอย่างมาก เราขอทบทวนสิ่งที่เรามีใน app.yaml เมื่อสิ้นสุดโมดูลที่ 3 ดังนี้
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
หลังจากนั้น
ใน Python 3 คำสั่ง threadsafe, api_version และ libraries จะเลิกใช้งานทั้งหมด โดยถือว่าแอปทั้งหมดเป็นแบบ Threadsafe และไม่ได้ใช้ api_version ใน Python 3 เนื่องจากไม่มีแพ็กเกจของบุคคลที่สามในตัวที่ติดตั้งไว้ล่วงหน้าในบริการ App Engine อีกต่อไป libraries จึงเลิกใช้งานด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงเหล่านี้ได้ในเอกสารประกอบเกี่ยวกับการเปลี่ยนแปลงใน app.yaml ดังนั้น คุณควรลบทั้ง 3 รายการออกจาก app.yaml และอัปเดตเป็น Python 3 เวอร์ชันที่รองรับ (ดูด้านล่าง)
ไม่บังคับ: การใช้คำสั่ง handlers
นอกจากนี้ เรายังเลิกใช้งานคำสั่ง handlers ซึ่งเปลี่ยนเส้นทางการเข้าชมไปยังแอปพลิเคชัน App Engine ด้วย เนื่องจากรันไทม์รุ่นถัดไปคาดหวังให้เฟรมเวิร์กเว็บจัดการการกำหนดเส้นทางของแอป จึงต้องเปลี่ยน "สคริปต์ตัวแฮนเดิล" ทั้งหมดเป็น "auto" เมื่อรวมการเปลี่ยนแปลงจากด้านบนแล้ว คุณจะได้ app.yaml ดังนี้
runtime: python38
handlers:
- url: /.*
script: auto
ดูข้อมูลเพิ่มเติมเกี่ยวกับ script: auto ได้จากapp.yaml หน้าข้อมูลอ้างอิง
การนำคำสั่ง handlers ออก
เนื่องจากเลิกใช้งาน handlers แล้ว คุณจึงนำทั้งส่วนออกได้ โดยเหลือเพียงบรรทัดเดียว app.yaml
runtime: python38
โดยค่าเริ่มต้น การดำเนินการนี้จะเปิดใช้ Gunicorn WSGI Web Server ซึ่งพร้อมใช้งานสำหรับแอปพลิเคชันทั้งหมด หากคุณคุ้นเคยกับ gunicorn นี่คือคำสั่งที่จะดำเนินการเมื่อเริ่มต้นโดยค่าเริ่มต้นด้วย app.yaml แบบไม่มีอะไรเลย
gunicorn main:app --workers 2 -c /config/gunicorn.py
ไม่บังคับ: การใช้คำสั่ง entrypoint
อย่างไรก็ตาม หากแอปพลิเคชันของคุณต้องใช้คำสั่งเริ่มต้นที่เฉพาะเจาะจง คุณสามารถระบุได้ด้วยคำสั่ง entrypoint ซึ่งจะส่งผลให้เกิด app.yaml ที่มีลักษณะดังนี้
runtime: python38
entrypoint: python main.py
ตัวอย่างนี้ขอให้ใช้เซิร์ฟเวอร์การพัฒนา Flask แทน gunicorn โดยเฉพาะ นอกจากนี้ คุณต้องเพิ่มโค้ดที่เริ่มเซิร์ฟเวอร์การพัฒนาลงในแอปเพื่อเปิดใช้ในอินเทอร์เฟซ 0.0.0.0 บนพอร์ต 8080 โดยเพิ่มส่วนเล็กๆ นี้ที่ด้านล่างของ main.py
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
ดูข้อมูลเพิ่มเติมเกี่ยวกับ entrypoint ได้จากapp.yaml หน้าข้อมูลอ้างอิง ดูตัวอย่างและแนวทางปฏิบัติแนะนำเพิ่มเติมได้ในเอกสารการเริ่มต้นใช้งานสภาพแวดล้อมมาตรฐานของ App Engine รวมถึงเอกสารการเริ่มต้นใช้งานสภาพแวดล้อมที่ยืดหยุ่นของ App Engine
ลบ appengine_config.py และ lib
ลบappengine_config.pyไฟล์และlibโฟลเดอร์ เมื่อย้ายข้อมูลไปยัง Python 3 App Engine จะรับและติดตั้งแพ็กเกจที่ระบุไว้ใน requirements.txt
appengine_config.py ไฟล์การกำหนดค่าใช้เพื่อจดจำไลบรารี/แพ็กเกจของบุคคลที่สาม ไม่ว่าคุณจะคัดลอกเองหรือใช้ไลบรารี/แพ็กเกจที่มีอยู่แล้วในเซิร์ฟเวอร์ App Engine (บิลต์อิน) เมื่อเปลี่ยนไปใช้ Python 3 การเปลี่ยนแปลงที่สำคัญมีดังนี้
- ห้ามรวมไลบรารีของบุคคลที่สามที่คัดลอกมา (ระบุไว้ใน
requirements.txt) - ห้าม
pip installลงในโฟลเดอร์libซึ่งหมายความว่าห้ามมีโฟลเดอร์lib - ไม่มีไลบรารีของบุคคลที่สามในตัวของรายการใน
app.yaml - ไม่ต้องอ้างอิงแอปกับไลบรารีของบุคคลที่สาม จึงไม่มีไฟล์
appengine_config.py
เพียงระบุไลบรารีของบุคคลที่สามที่จำเป็นทั้งหมดใน requirements.txt ก็เพียงพอแล้ว
ติดตั้งใช้งานแอปพลิเคชัน
โปรดติดตั้งแอปอีกครั้งเพื่อให้แน่ใจว่าแอปทำงานได้ นอกจากนี้ คุณยังยืนยันได้ว่าโซลูชันของคุณใกล้เคียงกับโค้ด Python 3 ตัวอย่างของโมดูล 3 มากน้อยเพียงใด หากต้องการแสดงภาพความแตกต่างกับ Python 2 ให้เปรียบเทียบโค้ดกับเวอร์ชัน Python 2
ขอแสดงความยินดีที่คุณทำขั้นตอนโบนัสในโมดูลที่ 3 เสร็จแล้ว ไปที่เอกสารประกอบเกี่ยวกับการเตรียมไฟล์การกำหนดค่าสำหรับรันไทม์ Python 3 สุดท้าย โปรดดูสรุปก่อนหน้านี้ด้านบนเพื่อดูขั้นตอนถัดไปและการล้างข้อมูล
การเตรียมใบสมัครของคุณ
เมื่อถึงเวลาที่จะย้ายข้อมูลแอปพลิเคชันของคุณ คุณจะต้องย้ายพอร์ต main.py และไฟล์แอปพลิเคชันอื่นๆ ไปยัง 3.x ดังนั้นแนวทางปฏิบัติแนะนำคือพยายามอย่างเต็มที่เพื่อให้แอปพลิเคชัน 2.x ของคุณ "เข้ากันได้กับเวอร์ชันใหม่" มากที่สุด
มีแหล่งข้อมูลออนไลน์มากมายที่จะช่วยให้คุณทำสิ่งนี้ได้ เคล็ดลับสำคัญบางส่วนมีดังนี้
- ตรวจสอบว่าการขึ้นต่อกันของแอปพลิเคชันทั้งหมดเข้ากันได้กับเวอร์ชัน 3.x อย่างสมบูรณ์
- ตรวจสอบว่าแอปพลิเคชันของคุณทำงานบนเวอร์ชัน 2.6 เป็นอย่างน้อย (แนะนำให้ใช้เวอร์ชัน 2.7)
- ตรวจสอบว่าแอปพลิเคชันผ่านชุดทดสอบทั้งหมด (และครอบคลุมอย่างน้อย 80%)
- ใช้ไลบรารีความเข้ากันได้ เช่น
six, Future และ/หรือ Modernize - ศึกษาความแตกต่างที่สำคัญระหว่าง 2.x กับ 3.x ที่ไม่สามารถใช้งานร่วมกันได้
- การดำเนินการ I/O ใดๆ อาจทำให้เกิดความไม่เข้ากันระหว่างสตริง Unicode กับสตริงไบต์
เราออกแบบแอปตัวอย่างโดยคำนึงถึงสิ่งเหล่านี้ทั้งหมด แอปจึงทำงานบน 2.x และ 3.x ได้ทันที เพื่อให้เรามุ่งเน้นที่การแสดงให้คุณเห็นว่าต้องเปลี่ยนแปลงอะไรบ้างเพื่อใช้แพลตฟอร์มรุ่นถัดไป
8. แหล่งข้อมูลเพิ่มเติม
ปัญหา/ความคิดเห็นเกี่ยวกับ Codelab โมดูลการย้ายข้อมูล App Engine
หากพบปัญหาเกี่ยวกับ Codelab นี้ โปรดค้นหาปัญหาของคุณก่อนที่จะยื่นเรื่อง ลิงก์สำหรับค้นหาและสร้างปัญหาใหม่
แหล่งข้อมูลเกี่ยวกับการย้ายข้อมูล
คุณดูลิงก์ไปยังโฟลเดอร์ที่เก็บสำหรับโมดูลที่ 2 (START) และโมดูลที่ 3 (FINISH) ได้ในตารางด้านล่าง นอกจากนี้ คุณยังเข้าถึงได้จากที่เก็บสำหรับการย้ายข้อมูล App Engine ทั้งหมด ซึ่งคุณสามารถโคลนหรือดาวน์โหลดไฟล์ ZIP ได้
Codelab | Python 2 | Python 3 |
โมดูล 3 |
ทรัพยากร App Engine
แหล่งข้อมูลเพิ่มเติมเกี่ยวกับการย้ายข้อมูลนี้มีดังนี้
- ข้อมูลอ้างอิง Python Cloud NDB และ Cloud Datastore
- การย้ายข้อมูลไปยัง Python 3 และรันไทม์รุ่นถัดไปของ GAE
- ทั่วไป