ラベル flask の投稿を表示しています。 すべての投稿を表示
ラベル flask の投稿を表示しています。 すべての投稿を表示

2011年8月7日日曜日

FlaskでStreaming

久々にFlaskドキュメントページ見てたら、
Streamingのsnipetが掲載されてました。
(もしかして結構前から?)

Werkzeugには0.5から機能としてはあるみたいなんで、
きっと昔からできたんでしょう。

なかなか使い道ないけどTwitterのようなStreamingAPIとかかっこ良いですよね。

つーことでコード。

from flask import Flask
from flask import Response
import time

app = Flask(__file__)

@app.route("/streaming")
def streaming():
    def generate():
        while True:
            time.sleep(1)
            yield "test\n"
    return Response(generate(),direct_passthrough=True,mimetype='text/plain')

if __name__ == "__main__":
    app.run()


ResponseにStreamingするためのジェネレータを渡すだけ。
direct_passthroughはジェネレータを変更させないための引数らしい、wrapして返すため、後で変更されても影響を受けないようになると思われる(WSGIの仕様っぽい)。
mime/typeはお好きなものを。






それにしても簡単だなー。

2011年5月27日金曜日

DebugToolbarをFlaskにも

Flaskいいよー。Flask。
extensionsもガンガン増えてかなり色々なことができるようになりました。

今日のネタはDebugToolbarです。
ちょっとハマったりしたのでそのメモがわりに。
DebugToolbarはDjangoのextensionでもあるものらしく、
レスポンスタイムとかログとかHttpHeaderとか見れるすぐれもの。

Flaskでも使えるとなれば(Djangoでは使ったこと無いけど)これは試してみるしか

いつものようにeasy_install なり pipなりでflask-debugtoolbarをインストールしたらええやないか。

実行する最小セットは下記の通り。

from flask import Flask
#DebugToolbarをインポート
from flaskext.debugtoolbar import DebugToolbarExtension

app = Flask(__name__)
#パネルを登録
app.config['DEBUG_TB_PANELS'] = (
    'flaskext.debugtoolbar.panels.headers.HeaderDebugPanel',
    'flaskext.debugtoolbar.panels.logger.LoggingPanel',
    'flaskext.debugtoolbar.panels.timer.TimerDebugPanel',
)
#Debug用のシークレットキーを追加、デバッグモードON
app.config['SECRET_KEY'] = 'asd'
app.config['DEBUG'] = True

toolbar = DebugToolbarExtension(app)

@app.route('/')
def test():
    app.logger.info("hello")
    return ""

if __name__ == "__main__":
    app.run()

これでローカルホストからは右にデバッグ用の怪しいボタンが出てくるので、
押すと色々なデバッグ情報が見れるようになる。
自分の環境ではflaskがurl_ruleっていう関数がねーみたいなエラーがでたので、
flaskを最新版(0.7)に換えたらOKでした。

こういうのが増えてくると開発しやすくなりますねー。

2011年3月15日火曜日

Flask-Script

みなさんFlaskしてますか。
Flask相変わらず良いですね。
extensionの数も順調に増えていて良いですね。
mongoだのcouchだのの単語がみえてnosqlもバッチリですね。

ところでdjangoのmanage.py便利ですよね。
Flaskでもrunserverとかshellとかやりたい。
そんな時にはflask extensionsにあるFlask-Scriptですよ。

インストールはいつもの通り
easy_installなりpipなりでflask-scriptとしてください。

Webアプリ側はこんな感じ(applicaiton.py)
#web application
from flask import Flask
from flask import jsonify

app = Flask(__name__)

@app.route('/spam')
def spam():
    return jsonify(res='ok')

if __name__ == "__main__":
    app.run()


んでflask-script側。(manage.py)
#script
from flaskext.script import Manager
from application import app 
manager = Manager(app)

#manage.py にhelloコマンドの追加
@manager.command
def hello():
    print 'hello'

if __name__ == "__main__":
    manager.run()

managerにアプリ登録してやるだけです。

あとは
$python manage.py runserver
でサーバ起動とかできます。
$python manage.py shell
でインタラクティブシェル起動できます。

@manager.commandで独自コマンドも簡単に追加できるので重宝しそうです。

optionパーサも組み込まれているみたいなので、
applicationの起動に色々処理を追加したい場合などは使ってみると良いと思います。

詳細はこちらです。
http://packages.python.org/Flask-Script/

2011年1月22日土曜日

GAE上のFlaskで画像アップ&表示

みなさん。Flask使ってますか。

Flask最高ですね。
最近はWebアプリ作るときは何やるにしてもFlaskでやってます。
Javaのモジュールが必要なときはJythonつかってFlask動かすくらいです。
(これはまた別の話)

GAEも最高ですね。
ということで、Flask,GAEについて今日は書きたいと思います。
まあGAE上でFlask使う方法は色々なところで書かれているので割愛。

今日はGAE上のFlaskで画像のアップロードと表示について
結構時間かかったので備忘録として書きます。

pythonコードは以下のような感じ。

from flask import Flask
from flask import request
from flask import Response
from google.appengine.ext import db

app = Flask(__name__)

@app.route('/image/upload',methods=['POST'])
def upload_image():
    """画像アップロード"""
    uploaded_image = request.files['image']
    image = Image()
    image.content_type = uploaded_image.content_type
    image.image = uploaded_image.stream.read()
    image.put()
    return 'ok'

@app.route('/image')
def disp():
    """keyで表示"""
    image = Image.get(request.args.get('key',''))
    return Response(response=image.image,content_type=image.content_type)

class Image(db.Model):
    """画像保存用エンティティ"""
    content_type= db.StringProperty()
    image = db.BlobProperty()

まず登録時にはBigtable側に画像のバイナリとコンテントタイプを保存しておく。
で表示側にはResponseに画像バイナリとコンテントタイプを返してやる。


画像アップロードのformはこんな感じ

<form action="/admin/image/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image">
<input type="submit" value="upload">


表示側はこんな感じ

<img src="/image?key={{画像のキー}}" >

2011年1月8日土曜日

FlaskでJSONP

PythonのマイクロフレームワークFlaskでは
JSONを返却するためのメソッドjsonifyが定義されている。


from flask import Flask
from flask import jsonify

app=Flask(__name__)

@app.route('/test.json')
def test_json():
return jsonify(res='test')

if __name__ == '__main__':
app.run()



/test.jsonでリクエストすると
{
res:'test'
}
という結果が帰ってくる

JSONPにしたい場合はjsonifyは使えない。



@app.route('/test.jsonp')
def test_jsonp():
import json
request.args.get('callback') + '(' + json.dumps(dict(res='test')) + ')'



というように自分でリクエストパラメータからcallbackを受け取って
付与して返す必要がある。

ただしこのままでは、mimetypeの指定がないので
厳密にはmimetypeの指定を行わなくてはならない。
script/javascript

現状FlaskのJSONP用のmethod(padded_jsonify)が要望として上がっているが、
jsonifyのように*args,**kwdとすべての引数がjsonオブジェクトになるような機能のため
callbackが入る余地が無いみたいで、提案が今は棄却されている模様。