Google App Engine HTTP請求處理

教學範例4

RequestHandler物件

前面介紹過的資料模型(model)是負責儲存與讀取資料,範本引擎(template)則是用來顯示畫面。本篇文章要介紹的RequestHandler物件,是在webapp開發框架中用來處理HTTP請求的物件,它會產生適當的回應給用戶端。

在GAE的範例中,我們利用WSGIApplication來解析使用者傳送過來的HTTP請求,每一個URL網址會被導到一個相對應的webapp2.RequestHandler物件,當請求方法是Post時,就會用RequestHandler物件中的post方法處理,同理,當請求方法是Get時,就會利用RequestHandler物件中的get方法處理。

urls.py程式

import webapp2

from main import MainPage,Guestbook


application = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/sign', Guestbook),
], debug=True)


main.py程式

.................
.................
class MainPage(webapp2.RequestHandler):
    def get(self):
...........................
...........................

class Guestbook(webapp2.RequestHandler):
    def post(self):
..........................
.........................



URL網址解析

在WSGIApplication物件中,有關URL網址對應解析規則,我們可以直接指明某一個URL要對應到哪一個RequestHandler物件或是利用正規表示式來指定對應的通則。


例如我們顯示文章的URL可能是/article/2013/07/18/10或/article/2014/08/15/4的規則,它所代表的意義是某一個日期所發表的文章,因此我們可以使用正規表示法來描述這類型的網址。

application = webapp2.WSGIApplication([
    ('/article/(\d{4})/(\d{2})/(\d{2})/(\d+)', Article),
], debug=True)


在正規表示法中被括號 "( " 及 " ) "包起來的部份,就表示在RequestHandler物件中會被當成參數傳送進來,因此我們可以在post或get方法中,設計適當的參數來接收傳進來的文字型態的值。

class Article(webapp2.RequestHandler):
    def get(self,year,month,day,aid):
          ........................
          .......................


你也可以運用不定參數個數的方式來取得傳送進來的值,如:
class Article(webapp2.RequestHandler):
    def get(self,*args):
          .......................
          year=args[0]
          month=args[1]
          ........................
          ........................
          ........................

請求物件

當用戶端透過網頁以表單(form)或在網址URI上使用查詢字串query string(如/article?year=2014&month=7)的方式傳送參數時,我們可以把它們視為請求參數,如果我們要在RequestHandler物件中取得這些參數值,就必須使用request物件的get方法才能取得。

import webapp2

class Article(webapp2.RequestHandler):
    def post(self):
          year=self.request.get('year')
          month=self.request.get('month')
          ................


在某些情況下,你可能會接收不到用戶端的值,或是參數不存在。你可以設定預設值來解決這種問題。如:

import webapp2

class Article(webapp2.RequestHandler):
    def post(self):
          year=self.request.get('year',default_value='2014')
          month=self.request.get('month')
          ................

在HTML的表單中,部份欄位型態資料是可以複選的,如<select ....... multiple="true">或相同name變數的<input type="checkbox">欄位,同一個參數可能會接收到多筆資料,此時我們就可以用request物件的get_all來取得一個list的值資料。如:

html 檔

<select name="selectCourse" multiple="true">
    <option value="chinese">chinese</option>
    <option value="english">english</option>
    <option value="math">math</option>
</select>
....


py檔

import webapp2

class Course(webapp2.RequestHandler):
    def post(self):
          lstSelectCourse=self.request.get_all('selectCourse')
          for strCourse in lstSelectCourse:
          ................


有關request物件相關屬性,可參考
https://developers.google.com/appengine/docs/python/tools/webapp/requestclass?hl=zh-tw
      

沒有留言: