在套筒完成之前,如何从Web插座读取数据



我正在尝试在Python中构建客户端服务器应用程序。我的客户使用请求模块可以连接到服务器并上传JSON和文件。

服务器使用龙卷风框架。当服务器从客户端接收数据时,他们会开始处理并按零件发送结果。我的帖子处理程序的示例:

class PostAd(tornado.web.RequestHandler):
def post(self):
    jdata = self.get_body_arguments('json', False)[0]
    jdata = json.loads(jdata)
    id = self.insert_ad(jdata)
    fpath_list = self.save_files(self.request.files.values(), id)
    self.insert_file_path(id, fpath_list)
    self.write("Successfully posted into SQL with sql id: {0}".format(id))
    self.flush()
    self.write("Are u there?")
    self.finish()

在用于发布数据的客户请求中

r=agent.post("http://localhost:8888/api/v1/add-ad", data={"json": thread_data}, files=files)

以这种方式,我无法通过零件接收数据,因为r = agent.post将等到服务器关闭连接,但是我需要每次tornado Server都会使用self.flush()命令将数据发送给我的返回值(在我的示例我希望得到两个答案,第一个答案:"成功地发布了SQL ID:100",第二个答案:"您在那里吗?")。

可以使用请求模块进行操作,还是我需要在这里使用其他内容?

我不知道agent.post()是什么,但是您可以使用Tornado的HTTP客户端和streaming_callback选项来完成此操作。但是,您必须自己格式化请求主体,因为龙卷风没有内置的客户端支持多部分文件上传。

await AsyncHTTPClient().fetch(url, body=encoded_body, streaming_callback=print)

不能保证streaming_callback观察到的块将与flush的调用对齐,因此您应该格式化数据,以便客户端可以确定消息的开始或结束位置。

最新更新