網頁

搜尋此網誌

2009年9月9日 星期三

Webapp Framework 網頁應用程式框架

開發GAE(Google App Engine)的簡單方式,截至目前學習而言,我想應該就是使用Webapp框架來建立你的網頁應用程式(Web Application)會是比較容易的方式。Webapp框架參考文件:中文英文,這裡要注意的是GAE僅支援WSGI(Web Server Gateway Interface)的介面,這是什麼東西?抱歉,我目前還在研究當中,這裡就無法說明了。換句話說,GAE上面除了Webapp這個框架可以執行之外,也可以使用Django框架囉!

什麼是框架(framework)呢?從開發面來說,框架提供一些功能,這些功能讓你可以快速開發應用程式。好比說你買的一間房子,這間房子所在的公寓大樓就好像是框架,提供了水、電力、電信、樓梯、電梯等許多功能,至於這間房子要來做什麼用途,則是你的自由,房子就好比你的應用程式,沒有需要自己蓋一棟公寓大樓吧!這樣的好處是你很快就能住進去(也就是完成程式開發)。

來看看利用 Webapp框架的程式吧!

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.headers['Content-Type'] = 'text/plain'
    self.response.out.write('Hello, webapp World!')

application = webapp.WSGIApplication([('/', MainPage)], debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

這是一個相當簡單的應用程式,「Hello World」說明的這個Webapp框架要如何使用,我們先來看看!

第1列程式碼:從google.appengine.ext套件(package,在Python中是資料夾)中,匯入webapp模組(module,在Python中是.py檔案,一個py檔案中可以包含類別定義、函數定義、Python Script腳本),當你要使用webapp模組中的任何一個類別或是函數,都需要在前面加入「webapp.」的模組名稱。

第2列程式碼:從google.appengine.ext.webapp.util套件的util模組,匯入run_wsgi_app函式(function)使用,這樣的寫法,使用這個run_wsgi_app函式時,就不需要在run_wsgi_app函式前加入「webapp.」的模組名稱。
第5列程式碼:
  • 定義一個類別名稱為MainPage,而且這個類別是繼承webapp套件中的RequestHandler類別。
  • MainPage類別中,定義一個get函數,該函數是MainPage類別中的方法(method),是呼叫來處理HTTP GET要求。目前這個處理結果只會在瀏覽器中顯示Hello, webapp World!
第13列程式碼:新增一個名為application的變數,並指定為webapp.WSGIApplication([('/', MainPage)], debug=True)的一個物件。

第16列程式碼:定義一個函數為main函數,主要是執行run_wsgi_app(application),其中參數application必須是WSGI 應用程式物件(即webapp.WSGIApplication)。

第19列程式碼:判斷目前的模組(.py檔案)是不是正在執行的檔案,如果是,則呼叫main函數。這裡是利用Python預設的變數「__name__」來判斷,只要這個.py檔案是正在執行的話,則__name__變數會是"__main__"。關於這個用法,請參考Python Tutorial Release 2.5.4手冊中的「6.1.1 Executing modules as scripts

5 則留言:

  1. 您好可否引用您的框架比喻呢 請問我該如何寫上出處呢 謝謝

    回覆刪除
  2. Dear Reader:
    當然可以引用,歡迎您和我一起互相學習!
    出處使用這篇文章的URL就可以了,
    可以附上我的BLOG名稱「Electrical Engineering By t5318019® In NTUT™」,
    謝謝您的閱讀和使用。

    回覆刪除
  3. 我用手冊上也就是你寫的程式執行結果出現以下訊息跟最後一行顯示錯誤,請問原因在哪?


    Traceback (most recent call last):
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3211, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3154, in _Dispatch
    base_env_dict=env_dict)
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 527, in Dispatch
    base_env_dict=base_env_dict)
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2404, in Dispatch
    self._module_dict)
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2314, in ExecuteCGI
    reset_modules = exec_script(handler_path, cgi_path, hook)
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2205, in ExecuteOrImportScript
    handler_path, cgi_path, import_hook)
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2136, in LoadTargetModule
    module_code = compile(source_file.read(), cgi_path, 'exec')
    File "C:\helloworld\helloworld.py", line 4
    def get(self):
    ^
    IndentationError: expected an indented block

    回覆刪除
  4. Dear yao-su:

    根據您的錯誤訊息「IndentationError: expected an indented block」,這是Python程式碼沒有縮排,Python利用縮排判斷程式碼區塊。

    因為網頁上的排版問題,沒有注意到造成讀者的困擾,程式碼已經修改好了!或是請參考「Google 應用服務引擎
    」網頁:

    http://code.google.com/intl/zh-TW/appengine/docs/python/gettingstarted/usingwebapp.html

    回覆刪除
  5. 你好,我在手冊"運用使用者服務"一節中,執行他的範例程式出現以下錯誤:KeyError: 'warnings'


    程式碼:

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

    class MainPage(webapp.RequestHandler):
    def get(self):
    user = users.get_current_user()

    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))

    application = webapp.WSGIApplication(
    [('/', MainPage)],
    debug=True)

    def main():
    run_wsgi_app(application)

    if __name__ == "__main__":
    main()

    這次縮排都沒錯,問題出在哪呢可否幫忙解答?

    手冊:http://code.google.com/intl/zh-TW/appengine/docs/python/gettingstarted/usingusers.html

    回覆刪除

熱門文章