วิธีใช้ App Engine Memcache ในแอป Flask (โมดูล 12)

1. ภาพรวม

ชุดโปรแกรม Codelab สำหรับการย้ายข้อมูลแบบ Serverless (บทแนะนำแบบลงมือทำด้วยตนเอง) และวิดีโอที่เกี่ยวข้องมีจุดประสงค์เพื่อช่วยให้นักพัฒนาแอป Google Cloud Serverless ปรับการดำเนินการให้ทันสมัยได้ด้วยคำแนะนำการย้ายข้อมูลอย่างน้อย 1 รายการ โดยให้ย้ายออกจากบริการเดิมเป็นหลัก การดำเนินการดังกล่าวทำให้แอปพกพาไปได้ทุกที่ รวมถึงมอบตัวเลือกและความยืดหยุ่นที่มากขึ้น ทำให้สามารถผสานรวมและเข้าถึงผลิตภัณฑ์ Cloud ที่หลากหลายยิ่งขึ้น และอัปเกรดเป็นรุ่นภาษาใหม่ๆ ได้ง่ายยิ่งขึ้น แม้ว่าในช่วงแรกจะมุ่งเน้นที่ผู้ใช้ Cloud รุ่นแรกสุด ซึ่งเป็นนักพัฒนา App Engine (สภาพแวดล้อมมาตรฐาน) เป็นหลัก แต่ชุดโซลูชันนี้ก็กว้างพอที่จะรวมแพลตฟอร์มแบบ Serverless อื่นๆ เช่น Cloud Functions และ Cloud Run หรือแพลตฟอร์มอื่นๆ ที่เกี่ยวข้อง

Codelab นี้จะสอนวิธีรวมและใช้ App Engine Memcache กับแอปตัวอย่างจาก Codelab ของโมดูล 1 เราเพิ่มการใช้งาน Memcache ในบทแนะนำโมดูล 12 นี้ จากนั้นย้ายข้อมูลไปยัง Cloud Memorystore ถัดไปในโมดูล 13

คุณจะได้เรียนรู้วิธีต่อไปนี้

  • ใช้ App Engine Memcache API/ไลบรารี
  • เพิ่มการแคชลงในแอป Python 2 Flask App Engine NDB พื้นฐาน

สิ่งที่ต้องมี

แบบสำรวจ

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านเท่านั้น อ่านและทำแบบฝึกหัด

คุณจะให้คะแนนประสบการณ์การใช้งาน Python อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

คุณจะให้คะแนนความพึงพอใจในการใช้บริการ Google Cloud อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

2. ข้อมูลเบื้องต้น

หากต้องการย้ายข้อมูลจาก App Engine Memcache ให้เพิ่มการใช้งานในแอป Flask และ App Engine NDB ที่มีอยู่ ซึ่งเป็นผลมาจาก Codelab ของโมดูล 1 แอปตัวอย่างจะแสดงการเข้าชม 10 ครั้งล่าสุดของผู้ใช้ หากผู้ใช้คนเดิมรีเฟรชเบราว์เซอร์ ไม่ควรสร้างเอนทิตีการเข้าชมใหม่อย่างต่อเนื่องและดึงข้อมูลการเข้าชมล่าสุดจาก Datastore เราจึงจะแคชการเข้าชมล่าสุดเหล่านั้นไว้

หากผู้เข้าชมคนเดิมเข้าสู่หน้าเว็บ การเข้าชมเหล่านั้นจะถูกส่งคืนจากแคช หากผู้ใช้ใหม่เข้าชมเว็บไซต์หรือเวลาผ่านไปหนึ่งชั่วโมง แคชจะถูกล้างและแทนที่ด้วยรายการล่าสุด (รวมถึงการเข้าชมที่ลงทะเบียนใหม่) เมื่อใช้การผสานรวม App Engine Memcache นี้ เราจะย้ายข้อมูลไปยัง Cloud Memorystore ใน Codelab (โมดูล 13) ถัดไป

บทแนะนำนี้มีขั้นตอนต่อไปนี้

  1. การตั้งค่า/งานล่วงหน้า
  2. อัปเดตการกำหนดค่า
  3. แก้ไขโค้ดของแอปพลิเคชัน

3. การตั้งค่า/งานล่วงหน้า

ก่อนจะไปยังส่วนหลักของบทแนะนำ เราจะมาสร้างโปรเจ็กต์ รับโค้ด แล้วทำให้แอปพื้นฐานใช้งานได้เพื่อให้เราทราบว่าเราเริ่มเขียนโค้ดแล้ว

1. สร้างโปรเจ็กต์

หากคุณทำ Codelab ของโมดูล 1 เสร็จสมบูรณ์แล้ว เราขอแนะนำให้ใช้โปรเจ็กต์ (และโค้ด) เดียวกันนั้นซ้ำ หรือคุณจะสร้างโปรเจ็กต์ใหม่หรือนำโปรเจ็กต์อื่นที่มีอยู่มาใช้ใหม่ก็ได้ ตรวจสอบว่าโปรเจ็กต์มีบัญชีสำหรับการเรียกเก็บเงินที่ใช้งานอยู่และเปิดใช้ App Engine แล้ว

2. รับแอปตัวอย่างพื้นฐาน

ข้อกำหนดเบื้องต้นอย่างหนึ่งของ Codelab นี้คือแอปตัวอย่างโมดูล 1 ที่ใช้งานได้ หากคุณไม่มี ให้อ่านบทแนะนำ (ลิงก์ด้านบน) ให้เสร็จก่อนดำเนินการต่อ หรือหากคุ้นเคยกับเนื้อหาโมดูลอยู่แล้ว ก็เริ่มจากโค้ดโมดูล 1 ด้านล่างได้เลย

ไม่ว่าคุณจะใช้โค้ดของคุณเองหรือของเรา โค้ดโมดูล 1 คือส่วนที่เราจะเริ่มดำเนินการ Codelab นี้จะแนะนำแต่ละขั้นตอน สรุปด้วยโค้ดที่คล้ายคลึงกับสิ่งที่อยู่ในโฟลเดอร์ที่เก็บโมดูล 11 (FINISH)

ไดเรกทอรีของไฟล์โมดูล 1 START (ของคุณหรือของเรา) ควรมีลักษณะดังนี้

$ ls
README.md               main.py                 templates
app.yaml                requirements.txt

3. (อีกครั้ง) ทำให้แอปพื้นฐานใช้งานได้

ขั้นตอนก่อนการทำงานที่เหลือของคุณที่ต้องดำเนินการตอนนี้มีดังนี้

  1. ทำความคุ้นเคยกับเครื่องมือบรรทัดคำสั่ง gcloud
  2. ทำให้แอปตัวอย่างใช้งานได้อีกครั้งกับ gcloud app deploy
  3. ยืนยันว่าแอปทำงานบน App Engine โดยไม่มีปัญหา

เมื่อคุณดำเนินการขั้นตอนเหล่านี้เสร็จเรียบร้อยและเห็นว่าเว็บแอปทำงานแล้ว (โดยมีเอาต์พุตคล้ายกับด้านล่าง) คุณก็พร้อมที่จะเพิ่มการแคชในแอปแล้ว

a7a9d2b80d706a2b.png

4. อัปเดตการกำหนดค่า

ไม่จำเป็นต้องเปลี่ยนแปลงไฟล์การกำหนดค่า App Engine มาตรฐาน (app.yaml, requirements.txt, appengine_config.py)

5. แก้ไขไฟล์แอปพลิเคชัน

เนื่องจากเราเพิ่มเพียง App Engine API เท่านั้น จึงไม่มีแพ็กเกจภายนอกที่เกี่ยวข้อง ซึ่งหมายความว่าไม่จำเป็นต้องอัปเดตไฟล์การกำหนดค่า (app.yaml, requirements.txt, appengine_config.py) มีไฟล์แอปพลิเคชันเพียงไฟล์เดียว ซึ่งก็คือ main.py ดังนั้นการเปลี่ยนแปลงทั้งหมดในส่วนนี้จึงมีผลกับไฟล์นั้นเท่านั้น

การนำเข้า

ขั้นตอนที่สำคัญที่สุดคือการนำเข้าไลบรารี Memcache ซึ่งก็คือ google.appengine.api.memcache เนื่องจากเราจะแคชการเข้าชมล่าสุดในหนึ่งชั่วโมง ดังนั้นให้บวกค่าคงที่สำหรับจำนวนวินาทีในหนึ่งชั่วโมง ด้านล่างนี้คือลักษณะของโค้ดก่อนหน้านี้และการเปลี่ยนแปลงนี้

ก่อนหน้า:

from flask import Flask, render_template, request
from google.appengine.ext import ndb

app = Flask(__name__)

หลัง:

from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb

app = Flask(__name__)
HOUR = 3600

เพิ่มการแคชด้วยการรองรับ Memcache

การเปลี่ยนแปลงที่สำคัญที่สุดคือการเพิ่มการใช้แคชในแอปพลิเคชันของเรา กล่าวอย่างเจาะจงก็คือ เราควรแคชการเข้าชมครั้งล่าสุด ตรวจสอบว่าการเข้าชมที่แคชไว้พร้อมใช้งานหรือไม่ และพยายามใช้ผลลัพธ์ที่แคชไว้ให้ได้มากที่สุดตามแผนของเรา ขั้นตอนที่แอปจะใช้เพื่อให้บรรลุเป้าหมายของเรามีดังนี้

  1. ตั้งค่าการเข้าชมปัจจุบันและตั้งชื่อว่า visitor
  2. พยายามดึงข้อมูล visits ล่าสุดจากแคช
  3. หากแคชว่างเปล่าหรือผู้เข้าชมล่าสุด (visits[0]['visitor']) แตกต่างจากvisitorปัจจุบัน ให้จัดเก็บการเข้าชมใหม่ล่าสุดนี้ ดึงข้อมูลการเข้าชมล่าสุด และแคชการเข้าชมไว้ 1 ชั่วโมง
  4. แสดง visits ต่อผู้ใช้ผ่านเทมเพลตเว็บ

ต่อไปนี้คือข้อมูลก่อนและหลังการอัปเดต

ก่อนหน้า:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

หลัง:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    visits = memcache.get('visits')

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0]['visitor'] != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        memcache.set('visits', visits, HOUR)  # set() not add()

    return render_template('index.html', visits=visits)

ด้านล่างนี้เป็นการแสดงภาพการเปลี่ยนแปลงที่เกิดขึ้น

b1242503602f7bf0.png

นี่เป็นการสรุปการเปลี่ยนแปลงที่จำเป็นทั้งหมดสำหรับการเพิ่มการใช้ App Engine memcache ลงในแอปตัวอย่างโมดูล 1 มาสร้างและทำให้แอปนี้ใช้งานได้กัน

6. สรุป/ล้างข้อมูล

ส่วนนี้จะสรุป Codelab นี้โดยการทำให้แอปใช้งานได้ ซึ่งจะช่วยยืนยันว่าแอปทำงานได้ตามที่ต้องการและอยู่ในเอาต์พุตที่แสดงขึ้น หลังจากตรวจสอบแอปแล้ว ให้ทำตามขั้นตอนการทำความสะอาดและพิจารณาขั้นตอนถัดไป

ติดตั้งใช้งานและยืนยันแอปพลิเคชัน

ทำให้แอปใช้งานได้อีกครั้งกับ gcloud app deploy และยืนยันว่าแอปใช้งานได้ ตอนนี้โค้ดควรตรงกับที่อยู่ใน FINISH ซึ่งเป็นโฟลเดอร์ Module 12 ผลลัพธ์ที่ได้ควรเหมือนกับแอปโมดูล 1 ที่คุณทำให้ใช้งานได้ก่อนหน้านี้

a7a9d2b80d706a2b.png

สิ่งที่เราทำทั้งหมดคือทำให้ประสบการณ์ของผู้ใช้คนเดิมเร็วขึ้น เมื่อรีเฟรช คุณควรได้รับผลลัพธ์โดยตรงจากแคช ซึ่งจะไม่สร้างการเข้าชมใหม่และจะไม่ดึงข้อมูลของ Datastore

ขอแสดงความยินดีที่จบ Codelab ของโมดูล 12 สำหรับการเพิ่มการใช้บริการ memcache ของ App Engine ลงในแอปพลิเคชันตัวอย่างของเราแล้ว ตอนนี้คุณมีตัวเลือกในการพอร์ตแอป Python 2 นี้ไปยัง Python 3 ในขั้นตอนโบนัส

ล้างข้อมูล

ทั่วไป

หากดำเนินการเสร็จแล้ว เราขอแนะนำให้คุณปิดใช้แอป App Engine เพื่อหลีกเลี่ยงการเรียกเก็บเงิน อย่างไรก็ตาม หากคุณต้องการทดสอบหรือทดลองเพิ่มเติม แพลตฟอร์ม App Engine จะมีโควต้าฟรี และตราบใดที่คุณใช้งานไม่เกินระดับการใช้งานดังกล่าว เราก็จะไม่เรียกเก็บเงิน ค่าดังกล่าวมีไว้สําหรับการประมวลผล แต่ก็อาจมีการเรียกเก็บเงินค่าบริการ App Engine ที่เกี่ยวข้องด้วย ดังนั้นโปรดดูข้อมูลเพิ่มเติมในหน้าราคา หากการย้ายข้อมูลนี้เกี่ยวข้องกับบริการระบบคลาวด์อื่นๆ ระบบจะเรียกเก็บเงินแยกต่างหาก ในทั้ง 2 กรณี หากมี โปรดดูส่วน "เฉพาะสำหรับ Codelab นี้" ด้านล่าง

เพื่อการเปิดเผยข้อมูลทั้งหมด การทำให้ใช้งานได้กับแพลตฟอร์มการประมวลผลแบบ Serverless ของ Google Cloud อย่าง App Engine จะมีค่าใช้จ่ายในการสร้างและพื้นที่เก็บข้อมูลเล็กน้อย Cloud Build มีโควต้าฟรีของตนเอง เช่นเดียวกับ Cloud Storage พื้นที่เก็บข้อมูลของรูปภาพจะใช้โควต้านั้นหมด อย่างไรก็ตาม คุณอาจอาศัยอยู่ในภูมิภาคที่ไม่มีรุ่นฟรีดังกล่าว โปรดระวังการใช้พื้นที่เก็บข้อมูลของคุณเพื่อลดค่าใช้จ่ายที่อาจเกิดขึ้น "โฟลเดอร์" เฉพาะของ Cloud Storage ที่คุณควรตรวจสอบมีดังนี้

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • ลิงก์พื้นที่เก็บข้อมูลด้านบนขึ้นอยู่กับ PROJECT_ID และ *LOC*ของคุณ เช่น "us" หากแอปของคุณโฮสต์ในสหรัฐอเมริกา

ในทางกลับกัน หากคุณไม่ต้องการดำเนินการกับแอปพลิเคชันนี้หรือ Codelab การย้ายข้อมูลอื่นๆ ที่เกี่ยวข้องต่อไป และต้องการลบทุกอย่างออกทั้งหมด ให้ปิดโปรเจ็กต์

เฉพาะสำหรับ Codelab นี้

บริการในรายการด้านล่างเป็นบริการเฉพาะสำหรับ Codelab นี้ โปรดดูข้อมูลเพิ่มเติมในเอกสารประกอบของผลิตภัณฑ์แต่ละรายการ

  • บริการ App Engine Memcache มี 2 เวอร์ชัน โดยแต่ละเวอร์ชันจะมีโครงสร้างราคาของตัวเอง ดังนั้นคุณต้องติดตามการใช้งานที่เกี่ยวข้องกับการเรียกเก็บเงิน
  • บริการ App Engine Datastore ให้บริการโดย Cloud Datastore (Cloud Firestore ในโหมด Datastore) ซึ่งมีรุ่นฟรีเช่นกัน ดูข้อมูลเพิ่มเติมได้ที่หน้าราคา

ขั้นตอนถัดไป

การย้ายข้อมูลเชิงตรรกะถัดไปที่ต้องพิจารณามีอยู่ในโมดูล 13 ซึ่งจะแสดงให้นักพัฒนาแอปเห็นถึงวิธีย้ายข้อมูลจากบริการ App Engine memcache ไปยัง Cloud Memorystore การย้ายข้อมูลเหล่านี้เป็นตัวเลือกแบบไม่บังคับและพร้อมให้บริการสำหรับผู้ใช้ที่ต้องการดำเนินการตามขั้นตอนต่างๆ เพื่อปรับแอปพลิเคชันให้ทันสมัย บริการ Cloud Memorystore เป็นการอัปเกรดที่สำคัญกับ memcache ของ App Engine ด้วยเหตุผลหลายประการดังนี้

  • Cloud Memorystore ไม่ใช่แบบ Serverless ซึ่งหมายความว่าคุณต้องจัดสรรเซิร์ฟเวอร์สำหรับแคช นอกจากนี้ Cloud Memorystore ยังไม่มีรุ่นฟรี ปัจจัยทั้ง 2 อย่างนี้สามารถส่งผลต่อค่าใช้จ่ายได้อย่างมาก
  • Cloud Memorystore รองรับกลไกพื้นที่เก็บข้อมูลที่สำคัญ (เครื่องมือแคช), Redis และ Memcached แตกต่างกัน
  • Cloud Memorystore (สำหรับ Redis) มีชุดฟีเจอร์ที่สมบูรณ์และเจาะลึกกว่า App Engine Memcache
  • หากต้องการใช้ Cloud Memorystore คุณต้องตั้งค่าเซิร์ฟเวอร์ Cloud Memorystore เพิ่มเซิร์ฟเวอร์ไปยังเครือข่าย Google Cloud VPC จากนั้นให้แอป App Engine ใช้เครือข่ายนั้นในการสื่อสารกับเซิร์ฟเวอร์ Memorystore

หากไม่ต้องการใช้ฟีเจอร์ทั้งหมดจาก Cloud Memorystore หรือกังวลเกี่ยวกับผลกระทบที่มีต่อค่าใช้จ่าย ให้ใช้ App Engine Memcache ต่อไป

นอกเหนือจากโมดูล 13 แล้ว ยังมีการย้ายข้อมูลที่เป็นไปได้อื่นๆ จำนวนมาก เช่น Cloud NDB และ Cloud Datastore หรือ Cloud Tasks นอกจากนี้ยังมีการย้ายข้อมูลข้ามผลิตภัณฑ์ไปยัง Cloud Run และ Cloud Functions ด้วย คุณจะดูทั้งหมดได้ที่ที่เก็บการย้ายข้อมูล

ขั้นตอนถัดไปที่เป็นไปได้อีกแบบคือการย้ายไปยัง Python 3 ซึ่งเราจะกล่าวถึงในส่วนถัดไปเป็นขั้นตอนที่ไม่บังคับ

7. โบนัส: การย้ายข้อมูลไปยัง Python 3

ภาพรวม

ส่วนนี้ประกอบด้วยเนื้อหาโบนัสที่ไม่บังคับซึ่งย้ายข้อมูลแอปพลิเคชันโมดูล 12 ที่เราเพิ่งดำเนินการเสร็จสิ้นไปด้านบนไปยัง Python 3 โดยเริ่มจากการกำหนดค่า ตามด้วยแอปพลิเคชัน

ลดความซับซ้อนของ app.yaml

ประโยชน์อย่างหนึ่งของรันไทม์ของ Python 3 คือทำให้ app.yaml เรียบง่ายขึ้นอย่างมาก

ก่อนหน้า:

ด้านล่างนี้คือข้อมูลในบทความ app.yaml เมื่อสิ้นสุดโมดูล 12

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

เนื่องจากรันไทม์ของ Python 3 ต้องใช้เว็บเฟรมเวิร์กเพื่อทำการกำหนดเส้นทางของตนเอง ตัวแฮนเดิลเส้นทางทั้งหมดใน app.yaml จึงต้องเปลี่ยนเป็น auto หากไม่มีไฟล์แบบคงที่แสดง ผู้ใช้จะนำส่วน handlers: ออกทั้งหมดได้ทันที นอกจากนี้ ระบบเลิกใช้งานทั้ง threadsafe และ api_version แล้ว

หลัง:

ด้วยการเปลี่ยนแปลงที่จำเป็นตามที่ได้อธิบายไว้ นี่เป็น app.yaml ที่จะมาแทนที่ Python 3:

runtime: python39
app_engine_apis: true

บรรทัดเดียวที่ต้องอธิบายคือ app_engine_apis: true เมื่อบริการ App Engine เดิมพร้อมใช้งานสำหรับรันไทม์รุ่นที่ 2 ในปี 2021 รันไทม์บางรายการซึ่งรวมถึง Python 3 จำเป็นต้องมีการเปิดเครื่องเพิ่มเติมเพื่อเข้าถึง API เหล่านั้น เช่น ndb, taskqueue และ memcache บรรทัดนี้ในการกำหนดค่ามีไว้เพื่อตอบสนองวัตถุประสงค์ดังกล่าว

อัปเดต required.txt

ต้องเปิดเครื่อง API เดิมอีกครั้งใน requirements.txt: ต้องมีสิทธิ์เข้าถึง App Engine SDK ใหม่

ก่อนหน้า:

ด้านล่างนี้คือข้อมูลในบทความ app.yaml เมื่อสิ้นสุดโมดูล 12

flask

หลัง:

เพียงเพิ่ม App Engine Python SDK เพียงเท่านี้คุณก็จะได้สิ่งต่อไปนี้

flask
appengine-python-standard

ลบ appengine_config.py และ lib

รันไทม์ของ App Engine รุ่นใหม่ช่วยปรับปรุงการใช้งานแพ็กเกจของบุคคลที่สาม

  • ไลบรารีในตัวคือไลบรารีที่ Google ตรวจสอบแล้วและพร้อมให้ใช้งานในเซิร์ฟเวอร์ App Engine ซึ่งน่าจะเป็นเพราะมีโค้ด C/C++ ที่นักพัฒนาซอฟต์แวร์ไม่ได้รับอนุญาตให้ทำให้ใช้งานได้ในระบบคลาวด์ เนื่องจากไลบรารีเหล่านี้ไม่พร้อมใช้งานในรันไทม์รุ่นที่ 2 อีกต่อไป
  • ไม่จำเป็นต้องคัดลอกไลบรารีที่ไม่มีในตัว (บางครั้งเรียกว่า "ผู้ให้บริการ" หรือ "การรวมกลุ่มอีเมลด้วยตนเอง") ในรันไทม์รุ่นที่ 2 อีกต่อไป แต่ควรแสดงอยู่ใน requirements.txt ซึ่งระบบบิลด์จะติดตั้งในนามของคุณโดยอัตโนมัติเมื่อถึงเวลาทำให้ใช้งานได้

การเปลี่ยนแปลงการจัดการแพ็กเกจของบุคคลที่สามทำให้ไม่จำเป็นต้องใช้ไฟล์ appengine_config.py และโฟลเดอร์ lib ให้ลบออก ในรันไทม์รุ่นที่ 2 App Engine จะติดตั้งแพ็กเกจของบุคคลที่สามที่แสดงอยู่ใน requirements.txt โดยอัตโนมัติ สรุป:

  1. ไม่มีไลบรารีของบุคคลที่สามที่จัดกลุ่มไว้เองหรือคัดลอกมา แสดงรายการใน requirements.txt
  2. ไม่มี pip install ในโฟลเดอร์ lib ซึ่งหมายความว่าไม่มีเครื่องหมายจุด lib ของโฟลเดอร์
  3. ไม่แสดงข้อมูลไลบรารีของบุคคลที่สามในตัว (จึงไม่มีส่วน libraries) ใน app.yaml แสดงรายการใน requirements.txt
  4. การไม่มีไลบรารีของบุคคลที่สามให้อ้างอิงจากแอปหมายความว่าไม่มีไฟล์ appengine_config.py

ข้อกำหนดเพียงอย่างเดียวสำหรับนักพัฒนาซอฟต์แวร์คือการระบุรายการไลบรารีของบุคคลที่สามที่ต้องการใน requirements.txt

อัปเดตแอปพลิเคชันเพื่อใช้ App Engine SDK

ดังที่กล่าวไว้ข้างต้น แอป Python 3 ต้องมีการแก้ไขบางอย่างเพื่อเข้าถึงบริการแพ็กเกจของ App Engine ดังนี้

  1. แพ็กเกจ App Engine SDK (ใน requirements.txt)
  2. เปิดใช้งาน App Engine SDK (ใน app.yaml)
  3. ตัดออบเจ็กต์ WSGI (ใน main.py)

คู่แรกดำเนินการข้างต้นเสร็จสมบูรณ์แล้ว ดังนั้นข้อกำหนดสุดท้ายคือให้อัปเดต main.py

ก่อนหน้า:

ด้านล่างนี้คือ main.py ของ Python 2 ที่มีข้อสรุปของโมดูล 12

from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb

app = Flask(__name__)
HOUR = 3600

หลัง:

สำหรับพอร์ต Python 3 ให้นำเข้า SDK และรวมออบเจ็กต์แอป Flask เข้ากับพอร์ตดังกล่าว (SDK Wrapper) ซึ่งจะทำให้ได้ผลลัพธ์ต่อไปนี้

from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600

นักพัฒนาซอฟต์แวร์ต้องทำการเปลี่ยนแปลงเหล่านี้ในแอป Python เมื่อย้ายจาก 2.x เป็น 3.x เพื่อเข้าถึงบริการในแพ็กเกจ หากคุณไม่ได้ใช้ Flask เรายังมีตัวอย่าง Django และ Pyramid ในเอกสารด้วย หากโค้ด Python 2 ไม่ใช่เว็บแอป แค่ใส่แพ็กเกจ SDK ก็เพียงพอแล้วเมื่อพอร์ตไปยัง Python 3 โค้ดของแอปพลิเคชันเดิมสร้างขึ้นเพื่อให้ทำงานภายใต้ Python 2 และ 3 ได้ ดังนั้นจึงไม่จำเป็นต้องเปลี่ยนแปลงความเข้ากันได้เพิ่มเติม

ทำให้แอปพลิเคชันใช้งานได้

หลังจากทำการเปลี่ยนแปลงข้างต้นเสร็จแล้ว คุณสามารถทำให้แอปตัวอย่างที่อัปเดตแล้วใช้งานได้ (ไม่มีปัญหาเมื่อทำให้แอปเวอร์ชัน Python 3 ใช้งานได้ผ่าน Python 2 เวอร์ชันเดิมในโปรเจ็กต์ GCP เดียวกัน) ลักษณะการทำงานของแอปควรจะเหมือนเดิม หากต้องการเปรียบเทียบแอปที่อัปเดตแล้วของเรา โปรดดูโฟลเดอร์ Module 12b ในที่เก็บการย้ายข้อมูล หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการรองรับบริการแพ็กเกจของ App Engine ในรันไทม์ล่าสุด เช่น Python 3 โปรดดูประกาศการเปิดตัวฟีเจอร์และ Codelab ของโมดูล 17

ขอแสดงความยินดีที่ผ่านขั้นตอนโบนัสในโมดูล 12 แล้ว โปรดดูเอกสารประกอบเกี่ยวกับการเตรียมไฟล์การกำหนดค่าสำหรับรันไทม์ของ Python 3 ด้วย ดูส่วนสรุป/ล้างข้อมูลด้านบนเพื่อดูขั้นตอนถัดไปและการทำความสะอาด

8. แหล่งข้อมูลเพิ่มเติม

รายการด้านล่างนี้เป็นแหล่งข้อมูลเพิ่มเติมสำหรับนักพัฒนาซอฟต์แวร์ที่ศึกษาเพิ่มเติมเกี่ยวกับโมดูลการย้ายข้อมูลนี้หรือที่เกี่ยวข้อง รวมถึงผลิตภัณฑ์ที่เกี่ยวข้อง ซึ่งรวมถึงพื้นที่สำหรับแสดงความคิดเห็นเกี่ยวกับเนื้อหานี้ ลิงก์ไปยังโค้ด และเอกสารประกอบต่างๆ ที่อาจเป็นประโยชน์กับคุณ

ปัญหา/ความคิดเห็นของ Codelab

หากมีปัญหาใดๆ เกี่ยวกับ Codelab นี้ โปรดค้นหาปัญหาของคุณก่อนยื่น ลิงก์สำหรับค้นหาและสร้างปัญหาใหม่

ทรัพยากรการย้ายข้อมูล

ดูลิงก์ไปยังโฟลเดอร์ที่เก็บสำหรับโมดูล 2 (START) และโมดูล 12 (FINISH) ได้ในตารางด้านล่าง นอกจากนี้ยังเข้าถึงได้จากที่เก็บสำหรับการย้ายข้อมูล Codelab ทั้งหมดของ App Engine ซึ่งจะโคลนหรือดาวน์โหลดไฟล์ ZIP ได้

Codelab

Python 2

Python 3

โมดูล 1

รหัส

รหัส (ไม่มีในบทแนะนำนี้)

โมดูล 12 (Codelab นี้)

รหัส

รหัส

ข้อมูลอ้างอิงออนไลน์

ด้านล่างนี้คือแหล่งข้อมูลออนไลน์ที่อาจเกี่ยวข้องกับบทแนะนำนี้

App Engine

Cloud Memorystore และ Cloud Datastore

ข้อมูลอื่นๆ เกี่ยวกับระบบคลาวด์

วิดีโอ

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0