X

Google App Engine 初學(6) - 處理 HTTP 請求 (RequestHandler)

HTTP 的處理分 Request 和 Response, 從 Client 來看, 一個是發送(Request)、另一個是接收(Response), 在 GAE 使用 Request Handler 統一處理.

處理 HTTP 請求 (RequestHandler)

RequestHandler 類別 分下述兩種:

  1. request: 文件可見 Request 類別
  2. response: 文件可見 Response 類別

Request 系列

Request 類別: Request 類別的實例包含連入網頁要求的相關資訊。

基礎範例


from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):
    def get(self):
        name = self.request.get('u', 'defult-value')
        self.response.out.write('Hello %s', name)

 def main():
     application = webapp.WSGIApplication([
         ('/', MainPage)
     ], debug = True)
     run_wsgi_app(application)

 if __name__ == '__main__':
     main()

下述改的都是 MainPage 內 get() 的程式, 其它都跟上述一致.

抓取 HTTP Header


class MainPage(webapp.RequestHandler):
    def get(self):
        headers = self.request.headers.items()
        for key, value in headers:
            self.response.out.write('<b>%s</b>: %s<br>' % (key, value))

'''
# 秀出 headers 中 User-Agent 的值, 兩者結果都一樣, 建議使用 self.request.headers.get('User-Agent')
self.response.out.write(self.request.headers.get('User-Agent'))
self.response.out.write(self.request.headers['User-Agent'])
'''

HTTP Header 列表、範例

Header 列表: Keep-Alive, Content-Length, Accept-Charset, User-Agent, Host, Connection, Cache-Control, Accept, Accept-Language, Content-Type

  • Keep-Alive: 300
  • Content-Length:
  • Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7
  • User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; zh-TW; rv:1.9.1.4)
  • Gecko/20091028 Ubuntu/9.10 (karmic) Firefox/3.5.4
  • Host: localhost:8080
  • Connection: keep-alive
  • Cache-Control: max-age=0
  • Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  • Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
  • Content-Type: application/x-www-form-urlencoded
抓取 Cookie


class MainPage(webapp.RequestHandler):
    def get(self):
        self.request.cookies['name'] = 'tsung'

Response 系列

Response 類別: Response 類別的實例代表為回應網頁要求而傳送的資料。(相關文件: 重新導向、標頭和狀態碼)

Header 修改
  • self.response.headers["Content-Type"] = "image/png"
Header 增加狀態
  • self.response.headers.add_header("Expires", "Thu, 01 Dec 1994 16:00:00 GMT")

註: 在 Response 物件的 headers 物件中設定這些項目,不會有任何作用。

  • Content-Encoding
  • Content-Length
  • Date
  • Server
  • Transfer-Encoding
Header 範例
Header set_status


self.response.set_status(302, 'Found')
self.response.headers.add_header('Location', 'http://www.google.com')

500 error


try:
    # do something
except Error:
    self.error(500)

redirect 將網頁導到首頁


self.redirect('/')

Authorization 身份驗證


if not self.request.headers.has_key('Authorization'):
    self.response.set_status(401, 'Authorization Required')
    self.response.headers.add_header('WWW-Authenicate', 'Basic realm="This is test Auth"')
else:
    auth = self.request.headers.get('Authorization')
    idpwd = base64.decodestring(auth.split(' ')[1]) # base64encode(userid:password)
    userid, password = idpwd,split(':')
    self.response.out.write('ID: %s, Password: %s' % (userid, password))

Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post