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 ใช้งานได้
- โมดูล 2 App Engine ที่ใช้งานได้ แอป 2.x หรือ 3.x
แบบสำรวจ
คุณจะใช้ Codelab นี้อย่างไร
2. ข้อมูลเบื้องต้น
แม้ว่า Cloud NDB จะเป็นโซลูชัน Datastore ที่ยอดเยี่ยมสำหรับนักพัฒนาซอฟต์แวร์ App Engine มาอย่างยาวนานและช่วยเปลี่ยนไปใช้ Python 3 แต่ก็ไม่ใช่วิธีเดียวที่นักพัฒนา App Engine จะเข้าถึงพื้นที่เก็บข้อมูลได้ เมื่อ Datastore ของ App Engine เปลี่ยนเป็นผลิตภัณฑ์ของตัวเองในปี 2013 ทาง Google Cloud Datastore จะมีการสร้างไลบรารีของไคลเอ็นต์ใหม่ขึ้นเพื่อให้ผู้ใช้ทั้งหมดใช้ Datastore ได้
Python 3 App Engine และนักพัฒนาที่ไม่ใช่ App Engine ได้รับคำสั่งให้ใช้ Cloud Datastore (ไม่ใช่ Cloud NDB) เราขอแนะนำให้นักพัฒนา Python 2 App Engine ย้ายข้อมูลจาก ndb
ไปยัง Cloud NDB และพอร์ตไปยัง Python 3 จากที่นั่น แต่ยังสามารถเลือกย้ายข้อมูลไปยัง Cloud Datastore เพิ่มเติมได้ด้วย นี่เป็นการตัดสินใจที่สมเหตุสมผล โดยเฉพาะอย่างยิ่งนักพัฒนาซอฟต์แวร์ที่มีโค้ดที่ใช้ Cloud Datastore อยู่แล้ว เช่น โค้ดที่เพิ่งกล่าวไป และต้องการสร้างไลบรารีที่ใช้ร่วมกันในแอปพลิเคชันทั้งหมดของตน การใช้โค้ดซ้ำเป็นแนวทางปฏิบัติแนะนำเช่นเดียวกับความสอดคล้องของโค้ด ทั้งยังช่วยลดค่าใช้จ่ายในการบำรุงรักษาโดยรวม ดังที่สรุปไว้ที่นี่
การย้ายข้อมูลจาก Cloud NDB ไปยัง Cloud Datastore
- อนุญาตให้นักพัฒนาซอฟต์แวร์มุ่งเน้นที่โค้ดเบสเดียวสำหรับการเข้าถึง Datastore
- หลีกเลี่ยงการดูแลรักษาโค้ดบางอย่างโดยใช้ Cloud NDB และโค้ดอื่นๆ โดยใช้ Cloud Datastore
- ให้ความสอดคล้องกันมากขึ้นใน Codebase และนำโค้ดมาใช้ซ้ำได้ดีขึ้น
- เปิดใช้ไลบรารีที่ใช้ร่วมกัน/ใช้ไลบรารีที่ใช้ร่วมกันซึ่งช่วยลดค่าใช้จ่ายในการบำรุงรักษาโดยรวม
การย้ายข้อมูลนี้มีขั้นตอนหลักดังต่อไปนี้
- การตั้งค่า/งานล่วงหน้า
- แทนที่ Cloud NDB ด้วยไลบรารีของไคลเอ็นต์ Cloud Datastore
- อัปเดตแอปพลิเคชัน
3. การตั้งค่า/งานล่วงหน้า
ก่อนจะไปยังส่วนหลักของบทแนะนำ เราจะสร้างโปรเจ็กต์ รับโค้ด แล้วทำให้แอปพื้นฐานใช้งานได้เพื่อให้เราทราบว่าเราเริ่มจากโค้ดที่ใช้งานได้แล้ว
1. สร้างโปรเจ็กต์
หากคุณทำ Codelab โมดูล 2 เสร็จสมบูรณ์แล้ว เราขอแนะนำให้ใช้โปรเจ็กต์ (และโค้ด) เดียวกันนั้นซ้ำ หรือจะสร้างโปรเจ็กต์ใหม่หรือนำโปรเจ็กต์อื่นที่มีอยู่มาใช้ใหม่ก็ได้ ตรวจสอบว่าโปรเจ็กต์มีบัญชีสำหรับการเรียกเก็บเงินที่ใช้งานอยู่และเปิดใช้ App Engine (แอป) แล้ว
2. รับแอปตัวอย่างพื้นฐาน
ข้อกำหนดเบื้องต้นอย่างหนึ่งคือต้องมีแอปตัวอย่างโมดูล 2 ที่ใช้งานได้ ให้ใช้วิธีแก้ปัญหาหากคุณศึกษาบทแนะนำนั้นจบแล้ว คุณสามารถดำเนินการได้เลย (ลิงก์ด้านบน) หรือหากคุณต้องการข้ามไปก่อน ให้คัดลอกที่เก็บโมดูล 2 (ลิงก์ด้านล่าง)
ไม่ว่าคุณจะใช้ของคุณเองหรือของเรา โค้ดโมดูล 2 คือส่วนที่เราจะเริ่มดำเนินการ Codelab ของโมดูล 3 นี้จะแนะนำคุณเกี่ยวกับแต่ละขั้นตอน และเมื่อดำเนินการเสร็จแล้ว โค้ดจะมีลักษณะคล้ายกับโค้ดที่จุด FINISH บทแนะนำนี้มีเวอร์ชัน Python 2 และ 3 ให้เก็บโค้ดที่ถูกต้องด้านล่าง
งูหลาม 2
- START: โค้ดโมดูล 2
- FINISH: โค้ดโมดูล 3
- ทั้งที่เก็บ (เพื่อโคลนหรือดาวน์โหลด ZIP)
ไดเรกทอรีของไฟล์เริ่มต้น Python 2 โมดูล 2 (ของคุณหรือของเรา) ควรมีลักษณะดังนี้
$ ls
README.md appengine_config.py requirements.txt
app.yaml main.py templates
หากดูบทแนะนำเกี่ยวกับโมดูล 2 จบแล้ว คุณจะมีโฟลเดอร์ lib
ที่มี Flask และทรัพยากร Dependency ด้วย หากไม่มีโฟลเดอร์ lib
ให้สร้างโฟลเดอร์ด้วยคำสั่ง pip install -t lib -r requirements.txt
เพื่อให้เราทำให้แอปพื้นฐานนี้ใช้งานได้ในขั้นตอนถัดไป หากคุณมีทั้ง Python 2 และ 3 ติดตั้งไว้อยู่แล้ว เราขอแนะนําให้ใช้ pip2
แทน pip
เพื่อไม่ให้สับสนกับ Python 3
งูหลาม 3
- START: ที่เก็บโมดูล 2
- FINISH: ที่เก็บโมดูล 3
- ทั้งที่เก็บ (เพื่อโคลนหรือดาวน์โหลด ZIP)
ไดเรกทอรีของไฟล์เริ่มต้น Python 3 โมดูล 2 (ของคุณหรือของเรา) ควรมีลักษณะดังนี้
$ 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
- หลัง (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
และsetuptools
appengine_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
ด้วย 1 รายการสำหรับ 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. สิทธิ์เข้าถึงพื้นที่เก็บข้อมูล
การย้ายข้อมูลไปยัง 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 ถัดไปแล้ว คุณก็เปิดใช้อีกครั้งได้ ระหว่างที่แอปปิดใช้อยู่ แอปจะไม่ทำให้เกิดการเรียกเก็บเงินใดๆ แต่อาจมีการเรียกเก็บเงินอีกอย่างหนึ่งคือการใช้พื้นที่เก็บข้อมูล หากแอปเกินโควต้าฟรี ให้ลบให้ไม่เกินจำนวนที่จำกัดไว้
ในทางกลับกัน หากไม่ต้องการย้ายข้อมูลต่อและต้องการลบทุกอย่างออกทั้งหมด คุณปิดโปรเจ็กต์ได้
ขั้นตอนถัดไป
จากตรงนี้ คุณสามารถสำรวจโมดูลการย้ายข้อมูลถัดไปเหล่านี้ได้
- โบนัสโมดูล 3: ไปที่ส่วนโบนัสเพื่อดูวิธีพอร์ตไปยัง Python 3 และรันไทม์ของ App Engine รุ่นใหม่
- โมดูล 7: คิวงานพุชของ App Engine (จำเป็นหากคุณใช้คิวงาน [push])
- เพิ่มงานพุช
taskqueue
งานของ App Engine ลงในแอปโมดูล 1 - เตรียมความพร้อมให้กับผู้ใช้สำหรับการย้ายข้อมูลไปยัง Cloud Tasks ในโมดูล 8
- เพิ่มงานพุช
- โมดูล 4: ย้ายข้อมูลไปยัง Cloud Run ด้วย Docker
- สร้างคอนเทนเนอร์เพื่อให้แอปทำงานบน Cloud Run ด้วย Docker
- อนุญาตให้คุณใช้ Python 2 ต่อไป
- โมดูล 5: ย้ายข้อมูลไปยัง Cloud Run ด้วย Cloud Buildpack
- สร้างคอนเทนเนอร์เพื่อให้แอปทำงานบน Cloud Run ด้วย Cloud Buildpack
- คุณไม่จําเป็นต้องทราบข้อมูลใดๆ เกี่ยวกับ Docker, คอนเทนเนอร์ หรือ
Dockerfile
- คุณต้องย้ายข้อมูลแอปไปยัง Python 3 แล้ว
- โมดูล 6: ย้ายข้อมูลไปยัง Cloud Firestore
- ย้ายข้อมูลไปยัง Cloud Firestore เพื่อเข้าถึงฟีเจอร์ของ Firebase
- แม้ว่า Cloud Firestore จะรองรับ Python 2 แต่ Codelab นี้มีให้บริการใน Python 3 เท่านั้น
7. โบนัส: ย้ายข้อมูลไปยัง Python 3
หากต้องการเข้าถึงรันไทม์และฟีเจอร์ล่าสุดของ App Engine เราขอแนะนำให้ย้ายข้อมูลไปยัง Python 3 ในแอปตัวอย่างของเรา 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 โดยไม่มีการแก้ไข ซึ่งหมายความว่าการเปลี่ยนแปลงที่จำเป็นมีเพียง 1 อย่างสำหรับการกำหนดค่าในกรณีนี้
- ลดความซับซ้อนของ
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 ซึ่งใช้ได้กับแอปพลิเคชันทั้งหมดโดยค่าเริ่มต้น หากคุณคุ้นเคยกับ gunicorn
นี่คือคำสั่งที่ลงนามเมื่อเริ่มต้นใช้งานโดยค่าเริ่มต้นด้วย Barebones 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
- ทั่วไป