BottleのRequest/Responseオブジェクトをマスター

  • 57
    Like
  • 0
    Comment
More than 1 year has passed since last update.

1ファイルフレームワークBottleは気軽にWebAPIなどを実装する際に便利ですね。ResponseとRequestオブジェクトの使い方についてメモしておきます。

Request

bottle.requestにアクセスすると、現在処理しているリクエストにアクセスできます。以下の例ではbottle.を省略します。

  • GETリクエストの場合のフォームパラメータ: request.query
  • POST/PUTリクエストの場合のフォームパラメータ: request.forms
  • GET/POST/PUT全部まぜこぜのフォームパラメータ request.params
  • HTTPヘッダの取得: request.get_header('User-Agent')
  • HTTPメソッド: request.method
  • リクエスト本文(body): request.body
  • アクセスされたURL: request.url urlpartsも便利
  • リモートアドレス: request.remote_addr

Response

bottleのrouteデコレータで修飾された処理関数は、文字列か、HTTPResponseクラスのインスタンスを返す必要があります。ここでは主にHTTPResponseクラスについて述べます

  • HTTPResponseクラスのコンストラクタはstatusとbodyをオプショナルに受け取る。
    • bodyのデフォルト値は''
    • statusのデフォルト値はNone => 基本的には200になる
    • statusは200のようなステータスコードか, '200 OK'のようなステータスのフル表記のどちらか
  • 属性bodyで本文(body)をセットできる
  • set_header(name, value)でHTTPヘッダを追加できる
    • 同様にget_header(name)もある
from bottle import HTTPResponse
body = '<html><body>ok</body></html>'
r = HTTPResponse(status=200, body=body)
r.set_header('Content-Type', 'text/html')

bodyは後からr.body = '...'のようにセットすることも可能なようです。

リダイレクトするレスポンス例

@route('/gotosomewhere')
def gotosomewhere():
    r = HTTPResponse(status=302)
    r.set_header('Location', 'http://example.com')
    return r

JSONを返す例

import simplejson as json
@route('/something.json')
def somethingjson():
    body = json.dumps({'message': 'hello world'})
    r = HTTPResponse(status=200, body=body)
    r.set_header('Content-Type', 'application/json')
    return r