我尝试在connect
操作上访问Flask-SocketIO连接上从客户端(iOS; Swift)传递到服务器的变量。让我解释。当你想做一个随机动作时,你在服务器上有这样的东西,其中包括一个回调(参见下面代码中的data
):
@socketio.on('custom action', namespace = '/mynamespace')
def handle_custom_action(data):
print data
有一些预设操作(例如connect
),显然connect
在调用时没有任何回调,因此客户端无法发送有关connect
操作的任何数据:
@socketio.on('connect', namespace = '/mynamespace')
def handle_connection(data):
print data # nothing gets printed
我深入研究了代码并发现了这一点。 on
函数的定义是:
def on(self, message, namespace=None):
然后在那个函数中(我省略了一些代码来达到目的):
if message == 'connect':
ret = handler()
else:
ret = handler(*args)
我可能错了,但似乎代码明确地没有返回连接上的任何内容,我不知道为什么?我发现了一些证据表明这在node.js中是可行的(我会在找到它时用适当的链接更新它)所以我想知道为什么在Flask-SocketIO库中这是不可能的或者我是否只是误解了我正在看的东西(如果是的话,如何获得这些参数)。
谢谢!
更新:
我确实找到了一种访问连接参数的方法,但它看起来并不像“正确的”#39;办法。我正在使用全局request
并拆分请求中出现的GET参数/查询字符串:
data = dict(item.split("=") for item in request.event["args"][0]["QUERY_STRING"].split("&"))
或者作为两行:
data = request.event["args"][0]["QUERY_STRING"].split("&"))
data = dict(item.split("=") for item in data.split("&"))
Flask-SocketIO添加了event
,它将字典与message
和args
的密钥连接起来,args
内是QUERY_STRING,然后我将其拆分为一个字典。这样可以正常工作,但它没有必要回答原来的问题,为什么没有回调?
以下是传递iOS连接参数的示例:
let connectParams = SocketIOClientOption.connectParams(["user_id" : Int(user.userId)!, "connection_id" : self.socketConnectionId])
self.socket = SocketIOClient(socketURL: URL(string: "http://www.myurl.com")!, config: [.nsp("/namespace"), .forceWebsockets(true), .forceNew(true), connectParams])