警告:對於long post的道歉使用user_loader連接flask-socketio
我們當前正在運行帶有couchdb後端的flask服務器。我們有幾個提供用戶信息的API端點。我們使用flask-login進行用戶管理。在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,使服務器和客戶端之間的聊天片段。下面我的代碼把看到的燒瓶socketio文檔的認證後段:
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
我有我的web套接字下面的代碼:
@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)
工作一切良好,在其他路線。不過,我得到以下錯誤,當我連接到的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'
我認爲login_required不socketio工作燒瓶socketio文檔中讀取。
是否有解決方法?任何幫助表示讚賞。
問候, Galeej
嗨米格爾,我經歷了一些你在github回購的答案...我做了以下幾點:1.我首先刪除了user_loader中的websocket的url,以禁用websocket每次和每次2.擊中user_loader。刪除所有形式的身份驗證並將必要的變量存儲爲會話變量。由於用戶必須在登錄WebSocket時登錄,因此現在可以使用:)。 – galeej