日頃からお世話になっている meinheld 大先生には
既存の wsgi アプリを簡単に WebSocket を実現する WebSocketMiddleware
というものが存在します。
僕みたいなヘタレヤロ―の書くコードだと meinheld とかにお世話にならないととても遅くて使いものにならない感じなので頭が上がらないですね。
で、そんな WebSocket を使っちゃってる最近のイケテルっぽいアプリを作ろうと思った時、
DB の選択肢としてはもうそんな勢いで当然 mongodb をチョイスしちゃいますよね。
yep.
で、meinheld の作者の方自ら書かれた meinheld WebSocketMiddleware を flask とかに適用しちゃうサンプルを参考にしつつ mongodb しちゃう物を組んでみるとこうなりますかと
from shimehari import Shimehari
from mongoengine import connect
from meinheld import server, middleware
import config
def connectDB():
connect(config['DB_NAME'])
app = Shimehari(__name__)
if __name__ == '__main__':
connectDB()
server.listen(("0.0.0.0", 3000))
server.run(middleware.WebSocketMiddleware(app))
##起動してみる
$ (venv) bin/python main.py
_人人人人人人人人_
> 突然のエラー <
 ̄Y^Y^Y^Y^Y^Y^Y ̄
##トレースバック
Traceback (most recent call last):
File "main.py", line 25, in <module>
connectDB()
File "/project/path/main.py", line 13, in connectDB
connect(config['DB_NAME'])
File "/project/path/lib/python2.7/site-packages/mongoengine/connection.py", line 162, in connect
return get_connection(alias)
File "/project/path/lib/python2.7/site-packages/mongoengine/connection.py", line 126, in get_connection
raise ConnectionError("Cannot connect to database %s :\n%s" % (alias, e))
mongoengine.connection.ConnectionError: Cannot connect to database default :
call from same greenlet
ちょっと何言ってるかわかりませんね。
port 周りだの host がおかしいのかと色々勘ぐったものの
ふと実装を以下のように変更してみたら動いた次第。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from shimehari import Shimehari
def connectDB():
connect(config['DB_NAME'])
app = Shimehari(__name__)
if __name__ == '__main__':
connectDB()
#db に接続した後 import
from meinheld import server, middleware
server.listen(("0.0.0.0", 3000))
server.run(middleware.WebSocketMiddleware(app))
ゴリゴリいじってるモヒカンな方々からすればあたりめーだろカス!なことなのかもしれませんが
ググったところで全然出て来なかったですし、
WebSocket する時 node.js 使う方のほうが多いと思うのでそりゃそうだろうなぁと思いつつ、
とりあえずこれで動いたのでよしとしつつ、
connecetDB
を with
な感じに置き換えるとよりよいのでしょうかと。