flask socketio 会话查询字符串

flask socketio session query string

此代码应该有效,但它不起作用

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

我试图用 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)
@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() 函数内部访问。

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

@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
});
...

替代解决方案:

@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>

做你想做的正确方法是:

@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 请求。如果使用某些查询字符串参数调用 /a 端点,则只能在该端点的处理程序中访问这些参数。但是将它们保存在会话中可以使 Socket.IO 事件处理程序稍后可以访问它们。