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: 1handlers:
- url: /.*
script: main.py
基本 Webapp Template
- 開發文件寫的方式 (建議使用此 Template)
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_appclass 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 webappclass 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_appclass 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)