flask socketio会话查询字符串

时间:2017-02-26 22:41:39

标签: python session flask socket.io flask-socketio

这段代码应该可行,但它不起作用

一旦客户端连接,会话' keyo'分配给值'示例'

我尝试使用session [' myvariable']

制作一个等效的socket.myvariable
@app.route("/a")
def helljo():
    return render_template('index.html')

@socketio.on('connect')
def handleMessagae():
    session['keyo'] = request.args.get('session') # /a?session=example
    emit('connected', session.get('keyo'))

@socketio.on('message')
def handleMessage(message):
    emit('message', {'pseudo':session.get('keyo'),'message':message} , broadcast=True, include_self=False)

4 个答案:

答案 0 :(得分:1)

正确的做法是:

@app.route("/a")
def helljo():
    session['keyo'] = request.args.get('session') # /a?session=example
    return render_template('index.html')

@socketio.on('connect')
def handleMessagae():
    emit('connected', session.get('keyo'))

@socketio.on('message')
def handleMessage(message):
    emit('message', {'pseudo':session.get('keyo'),'message':message} , broadcast=True, include_self=False)

问题是您正在将HTTP请求与Socket.IO请求混合在一起。如果使用某些查询字符串args调用/a端点,则只能访问该端点的处理程序中的那些参数。但是将它们保存在会话中会使Socket.IO事件处理程序稍后可以访问它们。

答案 1 :(得分:0)

@app.route("/a", methods=['GET'])
def helljo():
    session['keyo'] = request.args.get('session')
    socketio.emit('EVENT', {'var': session.get('keyo')})
    return render_template('index.html')

@socketio.on('connect')
def handleMessagae():
    emit('connected', session.get('keyo'))

@socketio.on('message')
def handleMessage(message):
    emit('message', {'pseudo':session.get('keyo'),'message':message} , broadcast=True, include_self=False)

这里的问题是,你试图在socketio事件中获取请求参数,这不会起作用,因为请求参数只能在@app.route()函数内访问。

答案 2 :(得分:0)

此代码的第四行发送给除请求发送者之外的所有客户端。我只想发送给发件人

@app.route("/a", methods=['GET'])
def helljo():
    session['keyo'] = request.args.get('session')
    socketio.emit('alert_sender', {'resp': session.get('keyo')})
    return render_template('index.html')

@socketio.on('connect')
def handleMessagae():
    emit('connected', 'hi')

@socketio.on('message')
def handleMessage(message):
    emit('message', {'pseudo':session.get('keyo'),'message':message} , broadcast=True, include_self=False)

在index.html上(当我继续/ a?session = example)

...
 socket.on('alert_sender', function(data) {
  alert(data.resp);      
 // others receive alert : example    sender receive : nothing
});
...

答案 3 :(得分:0)

替代解决方案:

@app.route("/a", methods=['GET'])
def index():
    resp = request.args.get('session')
    return render_template( 'index.html' , resp=resp )

@socketio.on('My_Event')
def message(msg):
    print(msg)
index.html上的

 <script>
      // ...
    {% if resp %}
    variable = '{{ resp }}';
    {% else %}
    variable = 'null';
    {% endif %}

      socket.emit( 'My_Event' , variable );
    // ...
    </script>