1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

meinheld + WebSocket + mongodb しようとした時エラーが出る

Last updated at Posted at 2013-02-07

日頃からお世話になっている meinheld 大先生には
既存の wsgi アプリを簡単に WebSocket を実現する WebSocketMiddleware というものが存在します。
僕みたいなヘタレヤロ―の書くコードだと meinheld とかにお世話にならないととても遅くて使いものにならない感じなので頭が上がらないですね。

で、そんな WebSocket を使っちゃってる最近のイケテルっぽいアプリを作ろうと思った時、
DB の選択肢としてはもうそんな勢いで当然 mongodb をチョイスしちゃいますよね。
yep.

で、meinheld の作者の方自ら書かれた meinheld WebSocketMiddleware を flask とかに適用しちゃうサンプルを参考にしつつ mongodb しちゃう物を組んでみるとこうなりますかと

main.py
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 がおかしいのかと色々勘ぐったものの
ふと実装を以下のように変更してみたら動いた次第。

main.py
#!/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 使う方のほうが多いと思うのでそりゃそうだろうなぁと思いつつ、
とりあえずこれで動いたのでよしとしつつ、
connecetDBwith な感じに置き換えるとよりよいのでしょうかと。

1
1
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?