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