Pages

8/25/2012

บันทึกการเริ่มเขียน Google App Engine ด้วย Python

เริ่มจากหน้า https://developers.google.com/appengine/

ตอนนี้ Google App Engine รองรับการใช้งาน 3 ภาษา:

  • Java
  • Python ( version 2.5 กับ 2.7 เขียนต่างกัน)
  • Go
บล๊อคนี้เลือกจะทำงานด้วย python 2.7 ซึ่งดูใหม่กว่า version 2.5 และมีระบบ threadsafe คือรองรับหลายๆ client แยกกันได้พร้อมกันได้

Python ยังสามารถเลือกได้ว่าจะใช้ framework อะไรในการจัดการหน้าเวป ไม่ว่าจะเป็น "webapp2" หรือ "django" แต่ตาม tutorial ของ Google จะให้เริ่มใช้งานที่ "webapp2" 

วิธีทำ
  1. มี Python 2.7 ลงอยู่ในเครื่อง (http://www.python.org/getit/releases/2.7/)
  2. ดาวน์โหลด App Engine SDK https://developers.google.com/appengine/downloads ซึ่งข้างในจะเป็น python code ที่ถูก zip เอาไว้  ข้างในมีคำสั่งสำคัญๆ สองตัวคือ:
    1. dev_appserver.py  เอาไว้รัน server ไว้ที่เครื่องตัวเอง สำหรับทดลองเขียนโค้ด
    2. appcfg.py เอาไว้สั่งอัพโหลดโค้ดขึ้นไปที่ Google App Engine
  3. แตกไฟล์ zip ที่ได้มา ไปไว้ที่ๆนึง ที่เรียกใช้ได้ถนัดๆ เช่น /opt   แล้วก็จะมีโครงสร้างเป็น
  4. /opt/
    --google_appengine/
    ----dev_appserver.py
    ----appcfg.py
    ----.........
    ----etc.
    
    
    
  5. เริ่มเขียน app.yaml ไว้สำหรับควบคุม app นี้  (app configuration file)
    • ไฟล์นี้จะต่างจากการเขียนสำหรับ python version 2.5 ตรงที่
      • [2.7] จะใช้ runtime: "python27", แต่ [2.5] จะใช้ runtime: "python25"
      • [2.7] จะใช้นามสกุลของไฟล์ว่า .app (ถึงแม้ไฟล์จริงๆจะเป็น .py) แต่ [2.5] ก็ยังใช้ .py เหมือนเดิม ดังนั้น ถ้าใน app.yaml มีบรรทัดไหนเขียนว่า .py จะเป็นสำหรับversion 2.5 และจะเกิด error ขึ้นเวลา compile บนระบบ 2.7
      • [2.7] จะเน้นใช้งานระบบ routing ภายในโค้ดที่เรียกว่า WSGIApplication มากกว่าระบบของ [2.5] ซึ่งจะต้องเขียน routing แยกแต่ละตัวที่ app.yaml เลย
        • ดังนั้น [2.7] อาจจะเขียนในไฟล์ app.yaml แค่
        • handlers:
          - url: /.*
            script: main.app
          
        • แต่ข้างใน main.app จะเป็น
        • app = webapp2.WSGIApplication([('/', MainPage), ('/another', AnotherPage), ('/test/([a-z]*)', TestPage)]);
        • ในขณะที่ [2.5] จะต้องเป็น
        • handlers:
          - url: /another
            script: another.py
          - url: /test/([a-z]*)
            script: test.py
          - url: /.*
            script: main.py
        • more : http://webapp-improved.appspot.com/guide/handlers.html
  6. โค้ดแบบง่ายของ app.yaml จะเป็น

  7. application: helloworld
    version: 1
    runtime: python27
    api_version: 1
    threadsafe: true
    
    handlers:
    - url: /.*
      script: main.app
    

  8. เริ่มเขียนโค้ด main.py

  9. import webapp2
    
    class MainPage(webapp2.RequestHandler):
        def get(self):
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.write('Hello, webapp2 World!')
    
    app = webapp2.WSGIApplication([('/', MainPage)], debug=True)
    
    • import webapp2   ==> เรียกใช้ webapp2 framework
    • class MainPage ==> สร้างคลาส MainPage ให้เป็นชนิด RequestHandler
    • def get(self) ==> สร้าง method ให้รองรับเวลาclient ส่งคำสั่ง HTTP GET มา
      • ตรงนี้จะต้องรับ self ไปเป็นตัวแปรแรกอยู่แล้ว
      • แต่ถ้าอยากจะรับตัวแปรอื่นเพิ่มจาก URL เช่น  อยากได้  /2012/08 แล้วให้ แปลงเป็น year, month จะต้องเขียนเป็น
        • แก้เป็น def get(self, year, month)
        • app = webapp2.WSGIApplication([('/([0-9]{2,4})/([0-9]{1,2})', MainPage)], debug=True)
        • ถ้าเกิดมีการเรียกเข้ามาโดยไม่ได้ใส่ค่านั้นใน URL, ตัวแปร year, month จะกลายเป็นค่า None  และสามารถเช็คค่าได้โดยการใช้  if year is None:
    • เนื่องจาก webapp2 นั้นอัพเกรดมาจาก webapp ดังนั้นจะต้องตามอ่าน documentation ของทั้งสองตัว
    • self มีอะไรให้เล่นหลายอย่าง อ่านเพิ่มตามนี้ http://webapp-improved.appspot.com/guide/handlers.html
    • WSGIApplication เป็นตัวกำหนด routing ให้กับระบบ
    • debug=True บอกว่าถ้าเกิดมีอะไรเกิดข้อผิดพลาดในโปรแกรม(ไม่ใช่เฉพาะrouting) ให้แสดง error trace บนหน้าเวปด้วย
  10. ทดลองรันบนเครื่องตัวเองด้วยคำสั่ง
    • <path ไป AppEngine SDK>/dev_appserver.py   <path ไปหาโค้ด>
    • เช่น /opt/google_appengine/dev_appserver.py   /codes/helloworld/
    • โดย default ตัว server จะ bind ไว้กับ  127.0.0.1:8080
      • ถ้าจะเปลี่ยน bind IP ให้ใช้  -a 0.0.0.0
      • ถ้าจะเปลี่ยน bind port ให้ใช้  --port 80    (อาจจะต้องการสิทธิ์ root สำหรับ port < 8000)
  11. อัพโหลดขึ้น Google App Engine cloud
    1. ไปที่ https://appengine.google.com/ แล้ว login เข้าโดยใช้ gmail
    2. สำหรับคนที่ไม่เคยสร้างเลย อาจจะต้อง verify ตัวเองก่อน โดยการใช้เบอร์โทรศัพท์ เพื่อที่จะรับโค้ดจาก Google ผ่านทาง SMS แล้วจึงนำโค้ดนั้นมากรอกบนหน้าเวปอีกที
    3. เมื่อ verify ผ่านแล้ว  จะเริ่มสร้าง Application (สร้างได้มากสุด 10 applications) โดย
      1. กดปุ่ม Create Application
      2. ก็จะมีให้กำหนดชื่อตัวโปรแกรม Application Identifier ชื่อนี้จะถูกนำไปใช้เป็น URL ด้วย คือจะได้ <appid>.appspot.com
      3. Application Title คือชื่อที่เราคนเดียวจะเห็นเวลาเราเข้ามาดูรายการ application เพราะถ้ามีหลาย application แล้วจะได้ไม่สับสน
      4. กด Create Application
    4. เมื่อสร้าง application เรียบร้อยแล้ว ให้กลับไปแก้ไฟล์ app.yaml เพื่อให้บรรทัด application: ..... มีชื่อตรงกับ Application Identifier ที่เราเพิ่งสร้างขึ้นมา
    5. เมื่อเรียบร้อยแล้ว  ใช้คำสั่งต่อไปนี้ เพื่ออัพโหลด application ขึ้นไป
      • <path ไป AppEngine SDK>/appcfg.py  update  <path ไปหาโค้ด>
      • เช่น  /opt/google_appengine/appcfg.py  update  /codes/helloworld/
      • หรือจะระบุ email ของ account ที่ใช้ login ไปเลยก็ได้โดย เพิ่ม --email=a@gmail.com
  12. เช็คเวบไซต์ที่ http://<appid>.appspot.com ว่าทำงานได้ถูกต้องหรือไม่


References:




No comments:

Post a Comment