警告:長いポストのお詫びフラスコと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
こんにちはミゲル、私はあなたの答えをgithub repoで調べました。私は次のことをしました:1.私は最初にuser_loaderでwebsocketのurlを削除して、毎回user_loaderに当たったwebsocketを無効にしました。すべての形式の認証を削除し、必要な変数をセッション変数として保存しました。ユーザーはWebSocketを押すとログインする必要があるので、今は大丈夫です:)。 – galeej