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

More than 5 years have 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