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)
請問 一個 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 很多不懂煩請指教. 感恩
呃, User 應該不會讓你砍掉吧, 因為 User 的 DB 只能夠讀取, 是不能寫入的.
然後, GAE 的 Framework, 有些東西, 不要追根究底, 應該說, framework 是目的是, 包成一個黑盒子, 不是要你去解密, 而是要你去快速使用他的. 🙂
問題是
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" ?
謝謝!
Login: users.create_login_url(self.request.path)
Logout: users.create_logout_url(self.request.path)
我有試 users.create_logout_url() 但是 user object != null
user 還是 原來 value.
Thanks !
你主要是想要做什麼事情呢?
如果是要確認使用者是否有登入 / 登出, 請愛用 users.get_current_user() 解決.
除此之外, 不知道您想要判斷 user object 的用意為何耶?
如果是要確認使用者是否有登入 / 登出, 請愛用 users.get_current_user() 解決.
>>>我 call users.create_logout_url() 登出, user 還是 原來 value.
>>>users.get_current_user() 還是 原來 user instance.
>>> print user 便知道
謝謝!
那我也不知道該怎麼解決了, 只能靠您自己囉~