2017-02-27 119 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