경고 : 긴 게시물에 대한 사과flask-socketio를 user_loader와 연결
현재 couchdb 백엔드가있는 플라스크 서버가 실행 중입니다. 사용자 정보를 제공하는 몇 가지 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)
우리는 또한 서버와 클라이언트 사이의 대화를 가능하게하는 웹 소켓이있는 부분이있다. 나는 아래의 코드는 플라스크-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
내 웹 소켓의 다음 코드가 있습니다
@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 작동하지 않습니다 login_required 플라스크-socketio 설명서를 읽어
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'
: 나는 웹 소켓에 연결할 때, 나는 다음과 같은 오류가 발생합니다.
해결 방법이 있습니까? 어떤 도움을 주셔서 감사합니다.
감사합니다, Galeej
안녕하세요 미구엘, github repo에 대한 답변을 몇 가지 살펴 봤습니다. 다음과 같이했습니다. 1. user_loader에서 websocket에 대한 url을 먼저 제거하여 websocket이 매번 user_loader에 도달하지 못하게하고 2. 모든 형태의 인증을 제거하고 필요한 변수를 세션 변수로 저장했습니다. 사용자가 websocket을 때면 로그인해야하기 때문에 지금은 괜찮습니다. :) – galeej