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

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming。將永久鏈結加入書籤。

Google App Engine 初學(5) - 使用 Webapp 有 8 則回應

  1. PR 說道:

    請問 一個 GAE 例子 : Using the Users Service
    例子會 call Google Accounts sign-in page 來 建立/刪除 user() instance
    但是 user calss 並沒有 _del__ method. user instance 是如何被刪除?

    我只用 C 語言寫過 firmware code. C++ 不熟. 老闆交付寫 cloud code.
    GAE 很多不懂煩請指教. 感恩

    • Tsung 說道:

      呃, User 應該不會讓你砍掉吧, 因為 User 的 DB 只能夠讀取, 是不能寫入的.
      然後, GAE 的 Framework, 有些東西, 不要追根究底, 應該說, framework 是目的是, 包成一個黑盒子, 不是要你去解密, 而是要你去快速使用他的. 🙂

  2. PR 說道:

    問題是
    if user:
    self.response.headers['Content-Type'] = 'text/plain'
    self.response.out.write('Hello, ' + user.nickname())
    else:
    self.redirect(users.create_login_url(self.request.uri))
    "else" 狀況 如何成立? user == null 才會成立. 但是如何使"user == null"
    我們不想用 GAE 的 Google Accounts sign-in page. 自己 create login - page
    . user init 沒問題. 但是 user logout 時. 如何使"user == null" ?
    謝謝!

  3. PR 說道:

    我有試 users.create_logout_url() 但是 user object != null
    user 還是 原來 value.
    Thanks !

    • Tsung 說道:

      你主要是想要做什麼事情呢?
      如果是要確認使用者是否有登入 / 登出, 請愛用 users.get_current_user() 解決.
      除此之外, 不知道您想要判斷 user object 的用意為何耶?

  4. PR 說道:

    如果是要確認使用者是否有登入 / 登出, 請愛用 users.get_current_user() 解決.
    >>>我 call users.create_logout_url() 登出, user 還是 原來 value.
    >>>users.get_current_user() 還是 原來 user instance.
    >>> print user 便知道
    謝謝!

發表迴響