教學範例4
在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):
..........................
.........................
在正規表示法中被括號 "( " 及 " ) "包起來的部份,就表示在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]
........................
........................
........................
class Article(webapp2.RequestHandler):
def post(self):
year=self.request.get('year')
month=self.request.get('month')
................
在某些情況下,你可能會接收不到用戶端的值,或是參數不存在。你可以設定預設值來解決這種問題。如:
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檔
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
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)
('/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
def post(self):
year=self.request.get('year')
month=self.request.get('month')
................
在某些情況下,你可能會接收不到用戶端的值,或是參數不存在。你可以設定預設值來解決這種問題。如:
import webapp2
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
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
沒有留言:
張貼留言