HTTP 的處理分 Request 和 Response, 從 Client 來看, 一個是發送(Request)、另一個是接收(Response), 在 GAE 使用 Request Handler 統一處理.
處理 HTTP 請求 (RequestHandler)
RequestHandler 類別 分下述兩種:
- request: 文件可見 Request 類別
- response: 文件可見 Response 類別
Request 系列
Request 類別: Request 類別的實例包含連入網頁要求的相關資訊。
基礎範例
from google.appengine.ext import webappclass 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))