2017-02-27 7 views
0

警告:長いポストのお詫びフラスコとsocketioをuser_loaderと接続

現在、couchdbバックエンドを備えたフラスコサーバーを実行しています。ユーザー情報を提供するAPIエンドポイントがいくつかあります。ユーザー管理のためフラスコログインを使用しました。 user_loaderは、各リクエストに応じて利用者データベースをチェック:

@login_manager.user_loader 
def load_user(id): 
    mapping = g.couch.get('_design/authentication') 
    mappingDD = ViewDefinition('_design/authentication','auth2',mapping['views']['userIDMapping']['map']) 
    for row in mappingDD[id]: 
     return userModel.User(row.value) 

我々はまた、サーバとクライアントの間でのチャットを可能にするためのWebSocketを持っているセグメントを持っています。

def authenticated_only(f): 
    @functools.wraps(f) 
    def wrapped(*args, **kwargs): 
     if not current_user.is_authenticated: 
      disconnect() 
     else: 
      return f(*args, **kwargs) 
    return wrapped 

私は私のウェブソケットのための次のコードを持っている:

@app.route('/sampleEndPoint/') 
def chatRoom(): 
    return render_template('randomIndex.html', async_mode=socketio.async_mode) 

@socketio.on('connect', namespace='/test') 
@authenticated_only 
def test_connect(): 
    app.logger.debug(session) 
    emit('my_response', {'data': 'Connected'}) 

@socketio.on('disconnect_request', namespace='/test') 
@authenticated_only 
def disconnect_request(): 
    session['receive_count'] = session.get('receive_count', 0) + 1 
    emit('my_response',{'data': 'Disconnected!', 'count': session['receive_count']}) 
    disconnect() 

@socketio.on('disconnect', namespace='/test') 
@authenticated_only 
def test_disconnect(): 
    print('Client disconnected', request.sid) 

すべてが他のルートではうまく機能し、以下のコードでは、私はフラスコ-socketio文書の認証部を見た後でした。しかし、私はのWebSocketに接続したときに、私は次のエラーを取得する:

File "/home/sunilgopikrishna/insurance_brokerage/perilback/main.py", line 144, in load_user mapping = g.couch.get('_design/authentication') File "/home/sunilgopikrishna/.local/lib/python3.5/site-packages/werkzeug/local.py", line 343, in getattr return getattr(self._get_current_object(), name) AttributeError: '_AppCtxGlobals' object has no attribute 'couch'

私はsocketioでは動作しませんlogin_requiredフラスコ-socketioドキュメントに読み込みます。

回避策はありますか?どんな助けもありがとうございます。

よろしく、 Galeej

答えて

1

I read in the flask-socketio documentation that login_required does not work with socketio

確かに、しかし、それはここでの問題ではありませんので、あなたは、あなたのsocketioイベントでlogin_requiredを使用していません。

問題はおそらくbefore_requestハンドラがg.couchに設定されていることです。 "before"ハンドラと "after"ハンドラはHTTP要求に対してのみ実行され、Socket.IOでは実行されません。このプロトコルでは要求の概念がないため、長期接続は1つだけです。

基本的に、before_requestハンドラに依存しないユーザーローダハンドラでデータベース接続にアクセスする別の方法を見つける必要があります。

+0

こんにちはミゲル、私はあなたの答えをgithub repoで調べました。私は次のことをしました:1.私は最初にuser_loaderでwebsocketのurlを削除して、毎回user_loaderに当たったwebsocketを無効にしました。すべての形式の認証を削除し、必要な変数をセッション変数として保存しました。ユーザーはWebSocketを押すとログインする必要があるので、今は大丈夫です:)。 – galeej

関連する問題