手元で実験のためにWebアプリのちょこっとしたプロトタイプを作るって時に、HTMLやCSSやJSなどを静的に配信したいだけだったら
python -mSimpleHTTPServer
が楽ちんだということはだいぶ知名度が上がってきたみたいだけど、「あ、ちょっとデータを保存したい」とか思った時には静的配信だけだと力不足なんだよね。(GETパラメータに積んでログに残すという力技は除く)
で、そういうシチュエーションになったので僕はFlaskで1ポモドーロ(25分)くらいで実装したんだけど、ふとFacebookを見たら似たようなシチュエーションでSocket使うとか言ってる人が居たのでこれはブログに書いておくべきことかーと思ったのです。
フレームワーク習得にかかる時間を大きく見積もり過ぎだよ。とりあえず25分間Quickstartをやってはどうか。Socketでサーバを実装するのに比べたら学習に掛かった時間はすぐにペイする。 http://flask.pocoo.org/docs/quickstart/
僕が実際に25分で実装したのがこちら: https://gist.github.com/nishio/be5b5071a8c8fb94836b
Hello worldをコピペするところから始めたんで関数名に痕跡が残っているし、printも消してないけど、出来たての汚いプロトタイプってのはこんなもん。
特定ディレクトリ以下を静的配信するのはこの3行
@app.route('/collecting/<path:filename>')
def send_foo(filename):
return send_from_directory('../collecting', filename)
特定URLへのPOSTを保存するのがこの4行。ちなみに1人で低頻度しか使わないのでデータベースいらないやとファイルに保存している。
@app.route('/api/save/<filename>', methods=['POST'])
def save(filename):
file(filename, 'w').write(request.form['data'])
return 'ok'
あと、Hello worldではdebugオプションがついていないけど、これをつけておくと500の時とかにスタックトレースとかが見れるし、スタックトレースの各フレームで対話的にコードを実行できるので原因を調べるのにも便利。
app.run(debug=True)
プロトタイプを作る人にとっては、Flaskの学習に25分投資するのはお得な賭けだと思うよ。
追記: あ、書き忘れたけどクライアントサイドはjQueryを使っていて、このAPIにデータを送るのはこんな感じ:
$.post('/api/save/hoge', {'data': 'datadatadata'})