Pythonで 5 分で便利なことをするレシピ
あけましておめでとうございます。本年もよろしくお願いします。
お正月休みはゴリゴリ PHP のコードを書いていた PHPer が Python って便利!!って思える事をちょっと書こうと思う。
因に Python 歴は去年の 6 月から仕事で使いだした初級者レベル。
他のレシピは id:nishiohirokazu さんのPythonで5分で便利なことをするレシピ - 西尾泰和のはてなダイアリーを参考にすると良いと思う!
最近 RESTful な Web アプリケーションを作っていて、POST や DELETE のリクエストを投げて動作確認をする必要があった。
ブラウザだと Firefox のアドオン、Mac だと HTTP Client というツールがあるが、いちいちツールを立ち上げるのメンドクサイ!ターミナルからやりたい!という場合に Python でこんな感じで書いた。
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib import httplib connection = httplib.HTTPConnection('localhost:5000') params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) headers = {'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'} connection.request('PUT', '/1', params, headers) response = connection.getresponse() data = response.read() print response.status, response.reason print data print '-'*50 connection.request('DELETE', '/1', {}, headers) response = connection.getresponse() data = response.read() print response.status, response.reason print data
テスト用のサーバは Flask でサクっと立てる
#!/usr/bin/env python # -*- coding: utf-8 -*- from flask import Flask app = Flask(__name__) @app.route('/', methods=['GET'], strict_slashes=False) def index(): return 'index' @app.route('/<id>/', methods=['PUT'], strict_slashes=False) def update(id): return 'update' @app.route('/<id>/', methods=['DELETE'], strict_slashes=False) def delete(id): return 'delete'
クライアントの実行結果
200 OK update -------------------------------------------------- 200 OK delete
サーバのログ
127.0.0.1 - - [03/Jan/2011 14:51:20] "PUT /1 HTTP/1.1" 200 - 127.0.0.1 - - [03/Jan/2011 14:51:20] "DELETE /1 HTTP/1.1" 200 -
とても簡単!
Python は標準ライブラリが充実しているのが素晴らしい。
因に httplib のコードは公式ドキュメントからのほぼコピペ。
http://docs.python.org/library/httplib.html
ちなみに PHP で同じ事をやろうと思うと、HTTP_Request2 を使うのてっとり早いが、組み込み関数でやるとこんな感じ。
<?php $params = array('spam' => 1, 'eggs' => 2, 'bacon' => 0); $headers = array( 'Content-type' => 'application/x-www-form-urlencoded', 'Accept' => 'text/plain' ); $context = array( 'http' => array( 'method' => 'PUT', 'headers' => implode("\r\n", $headers), 'content' => $params ) ); $data = file_get_contents('http://localhost:5000/1', false, stream_context_create($context)); var_dump($data);
string(6) "update"
レスポンスヘッダも取れないし非常に微妙だけど。
…とここまで書いてみて改めて見直してみたけど、別に面白いレシピじゃないな。
まぁいいや。
因に自分がすげー便利と思ったのはこれ。
http://d.hatena.ne.jp/perezvon/20101112/1289578015