--- title: BottleのRequest/Responseオブジェクトをマスター tags: Python bottle author: tomotaka_ito slide: false --- 1ファイルフレームワークBottleは気軽にWebAPIなどを実装する際に便利ですね。ResponseとRequestオブジェクトの使い方についてメモしておきます。 # [Request](http://bottlepy.org/docs/dev/api.html#the-request-object) `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](http://bottlepy.org/docs/dev/api.html#the-response-object) 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)`もある ```python from bottle import HTTPResponse body = 'ok' r = HTTPResponse(status=200, body=body) r.set_header('Content-Type', 'text/html') ``` bodyは後から`r.body = '...'`のようにセットすることも可能なようです。 ## リダイレクトするレスポンス例 ```python @route('/gotosomewhere') def gotosomewhere(): r = HTTPResponse(status=302) r.set_header('Location', 'http://example.com') return r ``` ## JSONを返す例 ```python 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 ```