警告:对于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