ページ

2010年11月19日

flask + gevent + websocket

ざっと3分間Google様で調べたところ、FlaskでWebsocketを扱うものはまだないらしいです。まあ、Flaskじゃなくてもwsgiを使っている何かでもいいのですが・・。

悲しいというか、使いたかったので、とりあえず、書いてみたものがこれです。以前geventでWebSocketを使ったもののコードをちょっとだけ変更したものです。といっても、myappでリクエストを受けて、websocketのパスでなければFlaskのアプリケーションに流し込んでいるだけです。パスの扱いが若干かっこわるいですが、変に処理するよりは単純なものの方がいいです。

以下、コードの抜粋です。chat用のhtmlは前回と同じなので、省略しています。まあ、大した話じゃないですね。

from geventwebsocket.handler import WebSocketHandler
from gevent import pywsgi
import gevent
from flask import Flask, request, flash, render_template, url_for
from flask import session, redirect, g
from flaskext.babel import Babel, gettext

app = Flask(__name__)

chat_html = """
[省略。chat用のhtmlです]
"""

chat_clients = set()

def handle_chat(ws):
    chat_clients.add(ws)
    while True:
        message = ws.wait()  
        if message is None:
            break
        for client in chat_clients:
            client.send(message)

    chat_clients.remove(ws)

@app.route("/")
def index():
    return "hello"

def myapp(environ, start_response):
    path = environ["PATH_INFO"]
    if path == "/":
        return app(environ, start_response)
    elif path == "/chat":
        handle_chat(environ["wsgi.websocket"])
    elif path == "/chat.html":
        start_response("200 OK", [])
        return chat_html
    else:
        return app(environ, start_response)

if __name__ == "__main__":
    server = pywsgi.WSGIServer(("", 5000), myapp, handler_class=WebSocketHandler)
    server.serve_forever()


0 件のコメント: