X

Google App Engine 初學(5) - 使用 Webapp

Google App Engine 初學, 此篇主要是使用 GAE 的 Webapp, 由此可以訂定程式的 API / Name 等等.

註: 等同於目前常見 MVC Framework 的 Contoller 部份.

使用 Webapp (Framework)

  • 詳細說明可見: 使用 Webapp 架構
  • 一或多個 RequestHandler 類別,可處理要求要建置反應
  • 一個 WSGIApplication 實例,會根據 URL 將連入要求傳送至處理常式
  • 一個主要常式,使用 CGI 配接程式來執行 WSGIApplication

app.yaml 設定

app.yaml
  application: hellpapp # hello_app => 會出現錯誤, 不能有 "_"
  version: 1
  runtime: python
  api_version: 1

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

基本 Webapp Template

  • 開發文件寫的方式 (建議使用此 Template)

    from google.appengine.ext import webapp
    from google.appengine.ext.webapp.util import run_wsgi_app

    class MainPage(webapp.RequestHandler):
        def get(self): # $_GET
            self.response.out.write('Hello, world')
        def post(self): # $_POST
            self.response.out.write('Hello, world')

    def main():
        application = webapp.WSGIApplication([
            ('/', MainPage),
        ], debug = True)
        run_wsgi_app(application)

    if __name__ == '__main__':
        main()

  • 或 (開發程式提供的範例)

    import wsgiref.handlers
    from google.appengine.ext import webapp

    class MainPage(webapp.RequestHandler):
        def get(self):
            self.response.out.write('Hello, world')

    def main():
        application = webapp.WSGIApplication([
            ('/', MainPage),
        ], debug = True)
        wsgiref.handlers.CGIHandler().run(application)

    if __name__ == '__main__':
        main()

上述 Webapp Template 寫法差異

  • from google.appengine.ext.webapp.util import run_wsgi_app 換成 import wsgiref.handlers
  • run_wsgi_app(application) 換成 wsgiref.handlers.CGIHandler().run(application)
  • 好壞沒去研究, 就看個人喜好吧.

範例

  • main.py

    from datetime import datetime
    from google.appengine.ext import webapp
    from google.appengine.ext.webapp.util import run_wsgi_app

    class MainPage(webapp.RequestHandler):
        def get(self):
            self.response.out.write('<h1>Hello, world</h1>')

    class NowPage(webapp.RequestHandler):
        def get(self):
            self.response.out.write('It is <b>%s</b> now.' % datetime.now())

    class Article(webapp.RequestHandler):
        def get(self, param1, param2): # 多個 參數傳入
            self.response.out.write('It is .' % (param1, param2))

    def main():
        application = webapp.WSGIApplication([
            ('/', MainPage),
            ('/now', NowPage),
            ('/article/(\d+)/(\d+)', Article)
        ], debug = True)
        run_wsgi_app(application)

    if __name__ == '__main__':
        main()

測試

  • /var/gae/dev_appserver.py helloapp # 啟動
  • http://localhost:8080/ => MainPage()
  • http://localhost:8080/now => NowPage()
  • http://localhost:8080/article/1/2 => Article(1, 2)
Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post