1. ภาพรวม
ชุด Codelab นี้ (บทแนะนำแบบลงมือปฏิบัติด้วยตนเอง) มีจุดมุ่งหมายเพื่อช่วยให้นักพัฒนาแอป Google App Engine (มาตรฐาน) ปรับแอปให้ทันสมัยด้วยการแนะนำการย้ายข้อมูลหลายๆ ครั้ง ขั้นตอนที่สำคัญที่สุดคือการเลิกใช้บริการที่มาพร้อมกับรันไทม์เดิม เนื่องจากรันไทม์รุ่นถัดไปมีความยืดหยุ่นมากกว่า ทำให้ผู้ใช้มีตัวเลือกบริการที่หลากหลายมากขึ้น การย้ายไปใช้รันไทม์รุ่นใหม่กว่าจะช่วยให้คุณผสานรวมกับผลิตภัณฑ์ Google Cloud ได้ง่ายขึ้น ใช้บริการที่รองรับได้หลากหลายมากขึ้น และรองรับการเปิดตัวภาษาในปัจจุบัน
บทแนะนำเบื้องต้นนี้แสดงขั้นตอนการย้ายข้อมูลแรกสำหรับการปรับปรุงเฟรมเวิร์กเว็บในแอป App Engine ให้ทันสมัย โดยย้ายจาก webapp2 ไปยัง Flask ในแอป คุณสามารถใช้เฟรมเวิร์กเว็บใดก็ได้ที่จัดการการกำหนดเส้นทาง แต่ในบทแนะนำนี้ เราจะใช้ Flask เนื่องจากชุมชนใช้กันอย่างแพร่หลาย
คุณจะได้เรียนรู้วิธีต่อไปนี้
- ใช้ไลบรารีของบุคคลที่สาม (ในตัวหรืออื่นๆ)
- อัปเดตไฟล์การกำหนดค่า
- ย้ายข้อมูลแอปอย่างง่ายจาก
webapp2ไปยัง Flask
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud Platform ที่มีสิ่งต่อไปนี้
- ทักษะ Python ขั้นพื้นฐาน
- มีความรู้พื้นฐานเกี่ยวกับคำสั่ง Linux ขั้นพื้นฐาน
- ความรู้พื้นฐานเกี่ยวกับการพัฒนาและการทําให้ใช้งานได้ของแอป App Engine
แบบสำรวจ
คุณจะใช้ Codelab นี้อย่างไร
2. ฉากหลัง
webapp Framework มาพร้อมกับ App Engine เมื่อเปิดตัวใน Python 2.5 เป็นครั้งแรกในปี 2008 ต่อมา webapp2 ก็เข้ามาแทนที่เมื่อรันไทม์ 2.7 เลิกใช้งาน 2.5 ในปี 2013
แม้ว่า webapp2 (ดูเอกสาร) จะยังคงมีอยู่และสามารถใช้ภายนอก App Engine เป็นเฟรมเวิร์กเว็บที่สอดคล้องกับ WSGI ได้ แต่ก็ไม่ได้กำหนดเส้นทางคำขอของผู้ใช้ไปยังโค้ดที่เหมาะสมในแอปพลิเคชันด้วยตัวเอง แต่จะใช้ App Engine, ไฟล์การกำหนดค่า และนักพัฒนาแอปเพื่อทำการกำหนดเส้นทางการเข้าชมเว็บไปยัง "ตัวแฮนเดิล" ที่เกี่ยวข้อง นอกจากนี้ webapp2's core benefits are inextricably tied to App Engine's bundled services, effectively deprecating it even though it works on Python 3 (also see related issue).
โมดูลนี้ช่วยให้ผู้ปฏิบัติงานได้รับประสบการณ์จริงในการย้ายข้อมูลแอป webapp2 อย่างง่ายไปยัง Flask ซึ่งเป็นเฟรมเวิร์กที่ App Engine และบริการอื่นๆ อีกมากมายนอก Google Cloud รองรับ ทำให้แอปพกพาได้มากขึ้น หาก Flask ไม่ใช่เฟรมเวิร์กที่ต้องการย้ายแอปพลิเคชันของคุณ คุณสามารถเลือกเฟรมเวิร์กอื่นได้ตราบใดที่เฟรมเวิร์กนั้นมีการกำหนดเส้นทางของตัวเอง Codelab นี้จะแสดงให้ผู้มีอำนาจตัดสินใจด้านเทคโนโลยีสารสนเทศ (ITDM) และนักพัฒนาซอฟต์แวร์ทราบขั้นตอนการย้ายข้อมูล เพื่อให้คุณคุ้นเคยกับกระบวนการนี้ไม่ว่าคุณจะย้ายข้อมูลไปยังเฟรมเวิร์กใดก็ตาม
ขั้นตอนหลักๆ สำหรับการย้ายข้อมูลนี้มีดังนี้
- การตั้งค่า/การเตรียมการ
- เพิ่มไลบรารีของบุคคลที่สามสำหรับ Flask
- อัปเดตไฟล์แอปพลิเคชัน
- อัปเดตไฟล์เทมเพลต HTML
3. การตั้งค่า/การเตรียมการ
ก่อนที่จะไปที่ส่วนหลักของบทแนะนำนี้ เรามาตั้งค่าโปรเจ็กต์ รับโค้ด แล้ว (ทบทวน)คำสั่ง gcloud และทำให้คุณคุ้นเคยกับการใช้งานคำสั่งนี้อีกครั้ง จากนั้นก็ติดตั้งใช้งานแอปพื้นฐานเพื่อให้เราทราบว่าเราเริ่มต้นด้วยโค้ดที่ใช้งานได้
1. ตั้งค่าโปรเจ็กต์
ในฐานะนักพัฒนาแอปที่มีอยู่ แดชบอร์ด App Engine น่าจะแสดงบริการที่คุณใช้งานอยู่แล้ว สำหรับวัตถุประสงค์ของบทแนะนำนี้ เราขอแนะนำให้คุณสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำสำหรับบทแนะนำนี้ ตรวจสอบว่าโปรเจ็กต์มีบัญชีสำหรับการเรียกเก็บเงินที่ใช้งานอยู่และเปิดใช้ App Engine (แอป) แล้ว
2. ดาวน์โหลดแอปตัวอย่างพื้นฐาน
ที่เก็บการย้ายข้อมูลของ GAE มีโค้ดทั้งหมดที่คุณต้องการ โคลนหรือดาวน์โหลดไฟล์ ZIP สำหรับบทแนะนำนี้ คุณจะเริ่มต้นด้วยโค้ดในโฟลเดอร์โมดูล 0 (START) และเมื่อทำตามบทแนะนำเสร็จแล้ว โค้ดของคุณควรตรงกับโฟลเดอร์โมดูล 1 (FINISH) หากไม่ ให้ดูความแตกต่างเพื่อให้คุณไปยังแล็บถัดไปได้
- เริ่มต้น: Module 0 code
- เสร็จสิ้น: โค้ดโมดูล 1
- ที่เก็บทั้งหมด (โคลนหรือดาวน์โหลด ZIP)
โฟลเดอร์ Module 0 ควรมีไฟล์ที่มีลักษณะดังนี้ ตามที่แสดงด้วยคำสั่ง POSIX ls
$ ls
app.yaml index.html main.py
3. (ทบทวน) ทำความคุ้นเคยกับgcloudคำสั่ง
หากยังไม่มีคำสั่ง gcloud ในเครื่อง ให้ติดตั้ง Google Cloud SDK และตรวจสอบว่า gcloud พร้อมใช้งานเป็นส่วนหนึ่งของเส้นทางการดำเนินการ และทำความคุ้นเคยกับคำสั่ง gcloud ต่อไปนี้
gcloud components update— อัปเดต Google Cloud SDKgcloud auth login— เข้าสู่ระบบบัญชีที่มีการให้สิทธิ์gcloud config list— แสดงการตั้งค่าการกำหนดค่าโปรเจ็กต์ GCPgcloud config set project PROJECT_ID— ตั้งค่ารหัสโปรเจ็กต์ GCPgcloud app deploy— ทำให้แอปพลิเคชัน App Engine ใช้งานได้
หากคุณไม่ได้พัฒนา App Engine ด้วย gcloud เมื่อเร็วๆ นี้ คุณควรเรียกใช้คำสั่ง 4 รายการแรก (#1-#4) เพื่อตั้งค่าก่อนที่จะไปยังขั้นตอนถัดไป มาดูภาพรวมคร่าวๆ ของคำสั่งเหล่านี้กัน
ก่อนอื่น gcloud components update ตรวจสอบว่าคุณมี Cloud SDK เวอร์ชันล่าสุด การเรียกใช้คำสั่งนี้ควรให้เอาต์พุตดังต่อไปนี้
$ gcloud components update
Your current Cloud SDK version is: 317.0.0
You will be upgraded to version: 318.0.0
┌──────────────────────────────────────────────────┐
│ These components will be updated. │
├──────────────────────────┬────────────┬──────────┤
│ Name │ Version │ Size │
├──────────────────────────┼────────────┼──────────┤
│ Cloud SDK Core Libraries │ 2020.11.06 │ 15.5 MiB │
│ gcloud cli dependencies │ 2020.11.06 │ 10.6 MiB │
└──────────────────────────┴────────────┴──────────┘
The following release notes are new in this upgrade.
Please read carefully for information about new features, breaking changes,
and bugs fixed. The latest full release notes can be viewed at:
https://cloud.google.com/sdk/release_notes
318.0.0 (2020-11-10)
. . .
(release notes)
. . .
Subscribe to these release notes at
https://groups.google.com/forum/#!forum/google-cloud-sdk-announce.
Do you want to continue (Y/n)?
╔════════════════════════════════════════════════════════════╗
╠═ Creating update staging area ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Uninstalling: Cloud SDK Core Libraries ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Uninstalling: gcloud cli dependencies ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Cloud SDK Core Libraries ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: gcloud cli dependencies ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Creating backup and activating new installation ═╣
╚════════════════════════════════════════════════════════════╝
Performing post processing steps...done.
Update done!
To revert your SDK to the previously installed version, you may run:
$ gcloud components update --version 317.0.0
จากนั้นใช้ gcloud auth login เพื่อตรวจสอบสิทธิ์ตัวเองสำหรับคำสั่ง gcloud ที่คุณจะออกในอนาคต
$ gcloud auth login
Your browser has been opened to visit:
https://accounts.google.com/o/oauth2/auth?response_type=code&client_id= . . .
You are now logged in as [YOUR_EMAIL].
Your current project is [PROJECT_ID]. You can change this setting by running:
$ gcloud config set project PROJECT_ID
ใช้ gcloud config list เพื่อดูการตั้งค่าโปรเจ็กต์ปัจจุบัน
$ gcloud config list [core] account = YOUR_EMAIL disable_usage_reporting = False project = PROJECT_ID Your active configuration is: [default]
คำสั่งด้านบนจะแนะนำให้คุณสร้างโปรเจ็กต์ใหม่หรือเลือกโปรเจ็กต์ที่มีอยู่ หากเอาต์พุตของ gcloud config list ไม่ตรงกับโปรเจ็กต์ที่เลือกซึ่งคุณต้องการใช้สำหรับบทแนะนำนี้ ให้เรียกใช้ gcloud config set project PROJECT_ID เพื่อตั้งค่ารหัสโปรเจ็กต์ จากนั้นยืนยันว่าได้ตั้งค่ารหัสโปรเจ็กต์ที่ถูกต้องโดยเรียกใช้ gcloud config list อีกครั้ง
$ gcloud config set project PROJECT_ID Updated property [core/project].
หากต้องการใช้ Cloud Console แทน คุณสามารถทำตามอินเทอร์เฟซผู้ใช้เพื่อสร้างโปรเจ็กต์ใหม่ได้หากต้องการ หรือใช้โปรเจ็กต์ที่มีอยู่แล้ว ในแดชบอร์ดของโปรเจ็กต์ คุณควรเห็นการ์ดข้อมูลโปรเจ็กต์ซึ่งแสดงรหัส (พร้อมชื่อและหมายเลขโปรเจ็กต์) ดังนี้

คำสั่งสุดท้าย (#5) gcloud app deploy ใช้สำหรับการทำให้แอปใช้งานได้กับ App Engine เนื่องจากเราเพิ่งเริ่มต้น การเรียกใช้ในตอนนี้จึงเป็นทางเลือก แต่เราไม่ได้ห้ามไม่ให้คุณติดตั้งใช้งานโค้ดโมดูล 0 เพื่อยืนยันว่าโค้ดทำงานได้ เมื่อดำเนินการแล้ว ให้เลือกภูมิภาคที่คุณต้องการให้แอปทำงาน (โดยปกติคือภูมิภาคที่คุณอยู่) แต่เมื่อตั้งค่าแล้วจะเปลี่ยนแปลงไม่ได้ จากนั้นดูข้อมูลการติดตั้งใช้งานที่เหลือ เมื่อดำเนินการเสร็จแล้ว คุณจะได้รับการแจ้งเตือนเกี่ยวกับ URL ที่แอปจะแสดง ตัวอย่างข้อความที่คุณอาจเห็นมีดังนี้
$ gcloud app deploy Services to deploy: descriptor: [/private/tmp/mod0-baseline/app.yaml] source: [/private/tmp/mod0-baseline] target project: [PROJECT_ID] target service: [default] target version: [20201116t220827] target url: [https://PROJECT_ID.REG_ABBR.r.appspot.com] Do you want to continue (Y/n)? Beginning deployment of service [default]... ╔════════════════════════════════════════════════════════════╗ ╠═ Uploading 1 file to Google Cloud Storage ═╣ ╚════════════════════════════════════════════════════════════╝ File upload done. Updating service [default]...done. Setting traffic split for service [default]...done. Deployed service [default] to [https://PROJECT_ID.REG_ABBR.r.appspot.com] You can stream logs from the command line by running: $ gcloud app logs tail -s default To view your application in the web browser run: $ gcloud app browse
หากไม่ได้ใช้ App Engine มาระยะหนึ่งแล้ว คุณอาจสังเกตเห็นว่าappcfg.py updateคำสั่งการติดตั้งใช้งานเดิมถูกแทนที่ด้วย gcloud app deploy ดูข้อมูลเพิ่มเติมเกี่ยวกับ gcloud app deploy ได้ที่หน้าเอกสารประกอบ
การเปลี่ยนแปลงล่าสุดอีกอย่างคือ URL ของแอปที่ติดตั้งใช้งาน ซึ่งปรับจาก http://PROJECT_ID.appspot.com เป็น http://PROJECT_ID.REG_ABBR.r.appspot.com ในที่สุดแอปส่วนใหญ่จะได้รับการแปลงเป็นรูปแบบใหม่ ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบ URL ได้ในเอกสารประกอบเกี่ยวกับคำขอและการกำหนดเส้นทาง
หลังจากที่ทำให้แอปใช้งานได้แล้ว ให้รีเฟรชเบราว์เซอร์ (อาจต้องรีเฟรช 2-3 ครั้ง) เพื่อดูการเข้าชมล่าสุด

หากแอปของคุณเป็นแอปใหม่ คุณจะเห็นการเข้าชมเพียงครั้งเดียวหรือ 2-3 ครั้งเท่านั้น
4. เพิ่มไลบรารีของบุคคลที่สามสำหรับ Flask
รันไทม์ของ App Engine สำหรับ Python 2 มีชุดไลบรารีของบุคคลที่สาม"ในตัว" ซึ่งคุณเพียงแค่ระบุไลบรารีเหล่านั้นในไฟล์ app.yaml เพื่อใช้งาน แม้ว่าการย้ายข้อมูลนี้จะไม่จำเป็นต้องใช้ แต่จะมีการกล่าวถึงในบทแนะนำการย้ายข้อมูลถัดไป (สำหรับโมดูลที่ 2)
ไลบรารีของบุคคลที่สามที่ไม่ได้สร้างขึ้นในตัวจะต้องระบุในไฟล์ที่ชื่อ requirements.txt และติดตั้งในเครื่องในโฟลเดอร์ lib ในไดเรกทอรีเดียวกับโค้ดแอปพลิเคชันที่อัปโหลดทุกอย่างไปยัง App Engine เอกสารประกอบสำหรับการรวมไลบรารีของบุคคลที่สามมีข้อมูลเพิ่มเติม
ไลบรารีที่คัดลอกมา เช่น Flask กำหนดให้คุณบอก App Engine ให้ค้นหาไลบรารีเหล่านั้นในโฟลเดอร์ lib โดยใช้ไฟล์กำหนดค่า appengine_config.py ไฟล์การกำหนดค่า appengine_config.py จะอยู่ในโฟลเดอร์แอปพลิเคชันระดับบนสุดเดียวกันกับ requirements.txt และ lib ในส่วนนี้ของบทแนะนำ คุณจะได้ทำสิ่งต่อไปนี้
- สร้าง
requirements.txt(ระบุไลบรารีของบุคคลที่สามที่คัดลอก [ไม่ใช่ไลบรารีในตัว]) - สร้าง
appengine_config.py(จดจำไลบรารีของบุคคลที่สาม) - ติดตั้งแพ็กเกจและทรัพยากร Dependency (ของบุคคลที่สาม)
1. สร้างrequirements.txt
สร้างrequirements.txtไฟล์เพื่อระบุแพ็กเกจ ในกรณีของเรา Flask คือไลบรารีของบุคคลที่สามที่จำเป็น ในขณะที่เขียนบทความนี้ เวอร์ชันล่าสุดคือ 1.1.2 ดังนั้นให้สร้าง requirements.txt ด้วยบรรทัดเดียวนี้
Flask==1.1.2
ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบที่ยอมรับได้ในrequirements.txtเอกสารประกอบ
2. สร้างappengine_config.py
ขั้นตอนถัดไปคือการทำให้ App Engine รู้จักไลบรารีภายนอกของบุคคลที่สาม สร้างไฟล์ชื่อ appengine_config.py ที่มีเนื้อหาต่อไปนี้
from google.appengine.ext import vendor
# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
โค้ดนี้จะทำตามที่เราได้ระบุไว้ก่อนหน้านี้ นั่นคือ ชี้ App Engine ไปยังโฟลเดอร์ lib สำหรับไลบรารีที่คัดลอก
3. ติดตั้งแพ็กเกจและทรัพยากร Dependency
ตอนนี้ให้เรียกใช้pip installคำสั่งเพื่อสร้างโฟลเดอร์ lib และติดตั้ง Flask รวมถึงทรัพยากร Dependency ในโฟลเดอร์นั้น
$ pip install -t lib -r requirements.txt
ไม่ว่าคุณจะใช้ pip หรือ pip2 หลังจากติดตั้งแพ็กเกจเสร็จแล้ว คุณควรมีโฟลเดอร์ lib ซึ่งมีเนื้อหาคล้ายกับตัวอย่างต่อไปนี้
$ ls lib bin/ click/ click-7.1.2.dist-info/ flask/ Flask-1.1.2.dist-info/ itsdangerous/ itsdangerous-1.1.0.dist-info/ jinja2/ Jinja2-2.11.2.dist-info/ markupsafe/ MarkupSafe-1.1.1.dist-info/ werkzeug/ Werkzeug-1.0.1.dist-info/
5. อัปเดตไฟล์แอปพลิเคชัน
ตอนนี้มาอัปเดตไฟล์แอปพลิเคชันกัน main.py
1. การนำเข้า
การนำเข้าจะมาเป็นอันดับแรกเหมือนในไฟล์ Python ทั้งหมด webapp2การนำเข้าเฟรมเวิร์กndbตามด้วยไลบรารี Datastore และสุดท้ายคือส่วนขยาย App Engine ที่ประมวลผลเทมเพลตสไตล์ Django คุณควรเห็นสิ่งต่อไปนี้
- ก่อน:
import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.webapp import template
เมื่อย้ายไปใช้ Flask คุณจะนำเข้าทั้ง Flask และส่วนการแสดงผลเทมเพลตพร้อมกัน ลบคู่การนำเข้าที่เกี่ยวข้องกับ webapp2 และแทนที่ด้วยการนำเข้าต่อไปนี้ (ปล่อยการนำเข้า ndb ไว้ตามเดิม)
- หลังจากนั้น
from flask import Flask, render_template, request
from google.appengine.ext import ndb
2. สตาร์ทอัพ
แอปที่ใช้ webapp2 ต้องมีอาร์เรย์เดียว (รายการ Python) ที่แสดงเส้นทางและตัวแฮนเดิลทั้งหมดในไฟล์ Python (อาจมีไฟล์อื่นๆ)
- ก่อน:
app = webapp2.WSGIApplication([
('/', MainHandler),
], debug=True)
โปรดทราบว่า app.yaml จะทำการกำหนดเส้นทางระดับสูงกว่าและอาจเรียกใช้แฮนเดิลเลอร์ที่แตกต่างกัน แอปตัวอย่างมีความเรียบง่ายเพียงพอที่เส้นทางทั้งหมดจะมาที่แฮนเดิล main.py
Flask ไม่ได้ใช้ตารางการกำหนดเส้นทางแบบนี้ ดังนั้นลบบรรทัดเหล่านี้ใน main.py Flask ยังต้องมีการเริ่มต้นด้วย ดังนั้นให้เพิ่มบรรทัดต่อไปนี้ที่ด้านบนของ main.py ใต้การนำเข้า
- หลังจากนั้น
app = Flask(__name__)
ใน Flask คุณจะเริ่มต้นเฟรมเวิร์ก จากนั้นใช้ Decorator เพื่อกำหนดเส้นทาง นอกจากนี้ เส้นทางจะจับคู่กับฟังก์ชัน ไม่ใช่คลาสหรือเมธอด
การรวมบทแนะนำ Flask ไว้ใน Codelab นี้อยู่นอกขอบเขต ดังนั้นโปรดใช้เวลาสักครู่เพื่อศึกษาบทแนะนำ Flask และอ่านเอกสารประกอบ Flask เพื่อให้คุ้นเคยกับเฟรมเวิร์กมากขึ้น
3. โมเดลข้อมูล
ไม่มีการเปลี่ยนแปลงที่นี่ Datastore จะเป็นหัวข้อหลักของ Codelab ถัดไป
4. เครื่องจัดการ
แอปพลิเคชันไม่ว่าคุณจะใช้เฟรมเวิร์กใด (webapp2 หรือ Flask) จะทำ 3 สิ่งต่อไปนี้
- จัดการคำขอ GET ของเส้นทางรูท (
/) - ลงทะเบียน "การเข้าชม" หน้าเว็บ (สร้าง/จัดเก็บออบเจ็กต์
Visit) - แสดงการเข้าชม 10 รายการล่าสุด (ด้วยเทมเพลตที่กำหนดไว้ล่วงหน้า
index.html)
webapp2เฟรมเวิร์กใช้รูปแบบการดำเนินการตามคลาส ซึ่งจะสร้างแฮนเดิลเลอร์สำหรับเมธอด HTTP ที่รองรับแต่ละรายการ ในกรณีที่ง่ายที่สุด เรามีเพียง GET ดังนั้นจึงกำหนดเมธอด get() ดังนี้
- ก่อน:
class MainHandler(webapp2.RequestHandler):
def get(self):
store_visit(self.request.remote_addr, self.request.user_agent)
visits = fetch_visits(10) or () # empty sequence if None
tmpl = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(tmpl, {'visits': visits}))
ดังที่กล่าวไว้ข้างต้น Flask จะกำหนดเส้นทางของตัวเอง คุณจะเขียนฟังก์ชันและตกแต่งด้วยเส้นทางที่ควรเรียกใช้แทนคลาสตัวแฮนเดิล ผู้ใช้สามารถระบุเมธอด HTTP ที่จัดการในการเรียกใช้ Decorator ได้ เช่น @app.route('/app/', methods=['GET', 'POST']) เนื่องจากค่าเริ่มต้นคือ GET เท่านั้น (และโดยนัยคือ HEAD) จึงไม่ต้องระบุ
ในการย้ายข้อมูลไปยัง Flask ให้แทนที่คลาส MainHandler และเมธอด get() ด้วยฟังก์ชันการกำหนดเส้นทาง Flask ต่อไปนี้
- หลังจากนั้น
@app.route('/')
def root():
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10) or () # empty sequence if None
return render_template('index.html', visits=visits)
แน่นอนว่านี่ไม่ใช่ตัวแทนของแอปของคุณ ซึ่งจะมีความซับซ้อนมากกว่าตัวอย่างนี้อย่างแน่นอน เป้าหมายหลักอย่างหนึ่งของบทแนะนำเหล่านี้คือการช่วยให้คุณเริ่มต้นใช้งาน สร้าง "ความจำกล้ามเนื้อ" และทำความเข้าใจว่าควรทำการเปลี่ยนแปลงที่ใดในโค้ดเฉพาะของ App Engine หากต้องการยืนยันว่าคุณได้ทำการเปลี่ยนแปลงนี้อย่างถูกต้อง ให้เปรียบเทียบของคุณกับโมดูลที่ 1 main.py
5. ไฟล์เสริม
ไม่มีการเปลี่ยนแปลงในไฟล์ .gcloudignore โดยมีวัตถุประสงค์เพื่อระบุไฟล์ที่ไม่ต้องนำไปใช้กับ App Engine ซึ่งไม่จำเป็นต่อการนำไปใช้และเรียกใช้แอปพลิเคชัน รวมถึงแต่ไม่จำกัดเพียงไฟล์ Python เสริม การควบคุมแหล่งที่มา บอยเลอร์เพลตของที่เก็บ และไฟล์อื่นๆ .gcloudignore ของเรามีลักษณะดังนี้ (เรานำความคิดเห็นออกเพื่อความกระชับ)
.gcloudignore
.git
.gitignore
.hgignore
.hg/
*.pyc
*.pyo
__pycache__/
/setup.cfg
README.md
6. อัปเดตไฟล์เทมเพลต HTML
1. ย้ายไฟล์เทมเพลต
ในโฟลเดอร์ที่เก็บข้อมูลพื้นฐาน (โมดูล 0) ไฟล์เทมเพลต index.html จะอยู่ในโฟลเดอร์เดียวกับไฟล์แอปพลิเคชัน เนื่องจาก Flask กำหนดให้วางไฟล์ HTML ไว้ในโฟลเดอร์ templates คุณจึงต้องสร้างโฟลเดอร์ดังกล่าว (mkdir templates) แล้วย้าย index.html ไปไว้ในนั้น ในระบบที่สอดคล้องกับ POSIX เช่น Linux หรือ Mac OS X คำสั่งจะเป็นดังนี้
mkdir templates
mv index.html templates
2. อัปเดตไฟล์เทมเพลต
เมื่อย้าย index.html ไปยัง templates แล้ว ก็ถึงเวลาแก้ไขเล็กน้อยแต่จำเป็น มาดูไฟล์เทมเพลตต้นฉบับทั้งหมดกัน
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
</body>
</html>
ในขณะที่ webapp2 ใช้เทมเพลต Django ซึ่งเรียกใช้ฟังก์ชันที่เรียกได้ เช่น visit.timestamp.ctime โดยไม่มีวงเล็บ ( ) แต่ Jinja2 กำหนดให้ต้องระบุอย่างชัดเจน แม้ว่าการปรับเปลี่ยนนี้อาจดูเหมือนเป็นการปรับแต่งเล็กๆ น้อยๆ แต่เทมเพลต Jinja ก็มีประสิทธิภาพมากกว่าเมื่อใช้งานทันที เนื่องจากคุณสามารถส่งอาร์กิวเมนต์ในการเรียกใช้ได้
ใน Django คุณต้องสร้าง "แท็กเทมเพลต" หรือเขียนตัวกรอง เมื่อเข้าใจแล้ว ให้อัปเดต index.html โดยเพิ่มวงเล็บคู่ในvisit.timestamp.ctimeการเรียกใช้ ดังนี้
- ก่อน:
<li>{{ visit.timestamp.ctime }} from {{ visit.visitor }}</li>
- หลังจากนั้น
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
นี่เป็นการเปลี่ยนแปลงเพียงอย่างเดียวที่จำเป็น ไม่จำเป็นต้องทำการเปลี่ยนแปลงเพิ่มเติมใน index.html สำหรับ Codelab การย้ายข้อมูลที่เหลือทั้งหมด
7. สรุป/ล้างข้อมูล
ติดตั้งใช้งานแอปพลิเคชัน
เมื่อทำการเปลี่ยนแปลงทั้งหมดในบทแนะนำนี้เสร็จแล้ว ไฟล์ในโฟลเดอร์แอปพลิเคชันควรจะเหมือนกับ (หรือเกือบเหมือนกับ) ไฟล์ในโฟลเดอร์ที่เก็บข้อมูลของโมดูล 1 ตอนนี้ให้ติดตั้งใช้งานและดูว่าแอปพลิเคชัน Flask ของโมดูล 1 ทำงานเหมือนกับเวอร์ชัน webapp2 ของโมดูล 0
ใช้คำสั่ง gcloud app deploy เหมือนที่เราทำไปก่อนหน้านี้เมื่อติดตั้งใช้งานโค้ด Module 0 เดิม เข้าถึงแอปที่ PROJECT_ID.appspot.com ไม่ว่าจะจากเว็บเบราว์เซอร์หรือคำสั่ง curl หรือ wget เพื่อยืนยันว่าแอปทำงานได้ตามที่คาดไว้
หากได้รับข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์ โดยปกติแล้วจะหมายความว่ามีข้อผิดพลาดบางอย่างในโค้ด Python โปรดดูบันทึกของแอปพลิเคชันเพื่อตรวจสอบ นอกจากนี้ ให้เปรียบเทียบไฟล์ของคุณกับไฟล์ในที่เก็บโมดูลที่ 1 (ลิงก์อยู่ด้านบน)
ไม่บังคับ: ล้างข้อมูล
แล้วการล้างข้อมูลเพื่อหลีกเลี่ยงการเรียกเก็บเงินจนกว่าคุณจะพร้อมที่จะไปยัง Codelab การย้ายข้อมูลถัดไปล่ะ ในฐานะนักพัฒนาแอปที่มีอยู่ คุณน่าจะทราบข้อมูลราคาของ App Engine อยู่แล้ว
ไม่บังคับ: ปิดใช้แอป
หากยังไม่พร้อมที่จะไปยังบทแนะนำถัดไป ให้ปิดใช้แอปเพื่อหลีกเลี่ยงการเรียกเก็บเงิน เมื่อพร้อมที่จะไปที่ Codelab ถัดไป คุณก็เปิดใช้ฟีเจอร์นี้อีกครั้งได้ ขณะที่แอปถูกปิดใช้ แอปจะไม่ได้รับการเข้าชมใดๆ ที่จะทำให้เกิดค่าใช้จ่าย แต่สิ่งอื่นที่คุณอาจถูกเรียกเก็บเงินคือการใช้งาน Datastore หากเกินโควต้าฟรี ดังนั้นให้ลบข้อมูลให้เพียงพอเพื่อให้อยู่ในขีดจำกัดนั้น
ในทางกลับกัน หากคุณไม่ต้องการดำเนินการย้ายข้อมูลต่อและต้องการลบทุกอย่างออกทั้งหมด คุณสามารถปิดโปรเจ็กต์ได้
ขั้นตอนถัดไป
มีโมดูลการย้ายข้อมูล 2 โมดูลที่เริ่มต้นด้วยโค้ดโมดูลที่ 1 ที่เสร็จสมบูรณ์แล้ว ได้แก่ โมดูล 2 และ 7
- โมดูล 2 (ต้องระบุหากใช้ Datastore)
- ย้ายข้อมูลจาก App Engine
ndbไปยัง Cloud NDB - หลังจากเปลี่ยนไปใช้ Cloud NDB แล้ว คุณจะใช้ตัวเลือกอื่นๆ ได้อีกมากมาย
- การสร้างคอนเทนเนอร์ของแอปเพื่อเรียกใช้ใน Cloud Run
- ย้ายข้อมูลแอปไปยังไลบรารีของไคลเอ็นต์ Cloud Datastore ต่อไป
- การย้ายข้อมูลแอปไปยัง Cloud Firestore เพื่อเข้าถึงฟีเจอร์ของ Firebase
- ย้ายข้อมูลจาก App Engine
- โมดูล 7 (ต้องระบุหากคุณใช้คิวงาน [พุช])
- เพิ่มการใช้งาน App Engine (พุช)
taskqueue - เตรียมแอปโมดูลที่ 1 สำหรับการย้ายข้อมูลไปยัง Cloud Tasks ในโมดูลที่ 8
- เพิ่มการใช้งาน App Engine (พุช)
8. แหล่งข้อมูลเพิ่มเติม
ปัญหา/ความคิดเห็นเกี่ยวกับ Codelab โมดูลการย้ายข้อมูล App Engine
หากพบปัญหาเกี่ยวกับ Codelab นี้ โปรดค้นหาปัญหาของคุณก่อนที่จะยื่นเรื่อง ลิงก์สำหรับค้นหาและสร้างปัญหาใหม่
แหล่งข้อมูลเกี่ยวกับการย้ายข้อมูล
คุณดูลิงก์ไปยังโฟลเดอร์ที่เก็บสำหรับโมดูล 0 (START) และโมดูล 1 (FINISH) ได้ในตารางด้านล่าง นอกจากนี้ คุณยังเข้าถึงได้จากที่เก็บสำหรับการย้ายข้อมูล App Engine ทั้งหมด ซึ่งคุณสามารถโคลนหรือดาวน์โหลดไฟล์ ZIP ได้
Codelab | Python 2 | Python 3 |
โมดูล 0 | (ไม่มี) | |
โมดูล 1 | (ไม่มี) |
ทรัพยากร App Engine
แหล่งข้อมูลเพิ่มเติมเกี่ยวกับการย้ายข้อมูลนี้มีดังนี้
- เฟรมเวิร์กเว็บขนาดเล็กของ Python
- (เดิม) การย้ายข้อมูลจาก Python 2.5 ไปยัง 2.7 และ
webappไปยังwebapp2 - การย้ายข้อมูลไปยัง Python 3 และรันไทม์รุ่นถัดไปของ GAE
- ทั่วไป