Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flask 将烧瓶插座与用户_加载器连接_Flask_Flask Login_Flask Socketio - Fatal编程技术网

Flask 将烧瓶插座与用户_加载器连接

Flask 将烧瓶插座与用户_加载器连接,flask,flask-login,flask-socketio,Flask,Flask Login,Flask Socketio,警告:很抱歉发了这么长的帖子 我们目前正在运行一个带有couchdb后端的flask服务器。我们有一些提供用户信息的API端点。我们使用flask登录进行用户管理。用户加载程序在每个请求上检查用户数据库: @login_manager.user_loader def load_user(id): mapping = g.couch.get('_design/authentication') mappingDD = ViewDefinition('_design/authentic

警告:很抱歉发了这么长的帖子

我们目前正在运行一个带有couchdb后端的flask服务器。我们有一些提供用户信息的API端点。我们使用flask登录进行用户管理。用户加载程序在每个请求上检查用户数据库:

@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来支持服务器和客户端之间的聊天。在查看flask 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时,出现以下错误:

文件“/home/sunilgopikrishna/insurance\u brokerage/perilback/main.py”, 第144行,装入用户 mapping=g.coach.get(“U设计/认证”)文件“/home/sunilgopikrishna/.local/lib/python3.5/site packages/werkzeug/local.py”, 第343行,在getattr return getattr(self.\u get\u current\u object(),name)AttributeError:“\u AppCtxGlobals”对象没有属性“coach”

我在flask socketio文档中读到,所需的登录名不适用于socketio

有解决办法吗?感谢您的帮助

问候,, 伽莱伊

我在flask socketio文档中读到,所需的登录名不适用于socketio

当然可以,但您没有在socketio事件中使用
login\u required
,因此这不是问题所在

问题是您可能有一个
before\u请求
处理程序设置
g.coach
。“before”和“after”处理程序只针对HTTP请求运行,而不针对Socket.IO运行,因为在这个协议中没有请求的概念,只有一个长期连接


因此,基本上,您需要在用户加载程序处理程序中找到另一种访问数据库连接的方法,这种方法不依赖于请求之前的
处理程序。

嗨,米格尔,我在github repo上浏览了您的一些答案。。。我做了以下几件事:1。我首先删除了user_loader中websocket的url,以禁用websocket每次和每次命中user_loader 2。我删除了所有形式的身份验证,并将必要的变量存储为会话变量。因为用户在点击websocket时必须登录,所以现在一切正常:)。