2017-02-27 19 views
0

경고 : 긴 게시물에 대한 사과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

답변

1

I read in the flask-socketio documentation that login_required does not work with socketio

물론,하지만 여기에 문제가되지 않습니다, 그래서 당신은 당신의 socketio 이벤트에 login_required을 사용하고 있지 않습니다.

g.couch을 설정하는 before_request 처리기가있는 것이 문제입니다. "이전"및 "이후"처리기는 HTTP 요청에 대해서만 실행되며이 프로토콜에는 요청 개념이 없으므로 Socket.IO 용으로 실행되지 않습니다. 단 하나의 장기 연결이 있습니다.

기본적으로 before_request 핸들러에 의존하지 않는 사용자 로더 핸들러에서 데이터베이스 연결에 액세스하는 다른 방법을 찾아야합니다.

+0

안녕하세요 미구엘, github repo에 대한 답변을 몇 가지 살펴 봤습니다. 다음과 같이했습니다. 1. user_loader에서 websocket에 대한 url을 먼저 제거하여 websocket이 매번 user_loader에 도달하지 못하게하고 2. 모든 형태의 인증을 제거하고 필요한 변수를 세션 변수로 저장했습니다. 사용자가 websocket을 때면 로그인해야하기 때문에 지금은 괜찮습니다. :) – galeej