geventをginkgoフレームワークで使ってみたよ

geventでWebSocketを使ってみる - へきょのーと
geventとWebSocketとFlask - へきょのーと

前回、前々回とgeventを使いましたが
今回はginkgoフレームワークを利用してやってみます。

※ginkgoの読みってギンコ??

環境

Max OS X 10.6.8
Python 2.7.3
gevent 0.13.7
Ginkgo 0.5.0dev

インストール

git clone https://github.com/progrium/ginkgo.git
cd ginkgo/
sudo python setup.py install

コーディング

app.py
import os
from ginkgo import Service
from ginkgo.async.gevent import WSGIServer
from geventwebsocket.handler import WebSocketHandler

class WebSocket(Service):
    def __init__(self):
        self.add_service(WSGIServer(('127.0.0.1', 8001), self.handle,
                                       handler_class=WebSocketHandler))

    def handle(self, environ, start_response):
        if environ.get('wsgi.websocket'):
            ws = environ["wsgi.websocket"]
            while True:
                src = ws.receive()
                if src is None:
                    break
                ws.send(src)

class Http(Service):
    f = open("./index.html");
    content = f.read()
    f.close()

    def __init__(self):
        self.add_service(WSGIServer(('127.0.0.1', 8000), self.handle))

    def handle(self, environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return [self.content]

class Application(Service):
    def __init__(self):
        self.add_service(Http())
        self.add_service(WebSocket())
index.html
<html>
<head>
  <title>ginkgo test</title>
</head>
<body>
  <h1>test</h1>
  <div>
    <input name="send_input" id="send_input" />
    <input type="button" value="push" onclick="send_data()" />
  </div>
  <div>
    <textarea id="view"></textarea>
  </div>

  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  <script type="text/javascript">
var ws = new WebSocket("ws://127.0.0.1:8001/");
ws.onmessage = function(e) {
  $("#view").html($("#view").val() + e.data + "\n");                                                                    
};
function send_data() {
  ws.send($("#send_input").val());
};
</script>
</body>
</html>

実行

ginkgo app.Application

ブラウザで"http://127.0.0.1:8000/"にアクセスして
input textに文字を入力して"push"すると

textareaに入力した内容が表示されました!