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 事件处理程序稍后可以访问它们。
此代码应该有效,但它不起作用
一旦客户端连接,会话 '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 事件处理程序稍后可以访问它们。