2017-02-27 121 views
0

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

回答

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运行,因为在此协议中没有请求的概念,只有一个长期连接。

因此,基本上,你需要找到另一种方式来访问你的用户加载处理您的数据库连接,不依赖于before_request处理程序。

+0

嗨米格尔,我经历了一些你在github回购的答案...我做了以下几点:1.我首先删除了user_loader中的websocket的url,以禁用websocket每次和每次2.击中user_loader。删除所有形式的身份验证并将必要的变量存储为会话变量。由于用户必须在登录WebSocket时登录,因此现在可以使用:)。 – galeej