如何在套接字完成之前从Web套接字读取数据

时间:2017-02-24 21:41:44

标签: python request tornado

我正在尝试在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会等到服务器关闭连接但每次龙卷风服务器使用self.flush()命令向我发送数据时都需要检查返回值(在我的例子我希望得到两个答案,第一个:“成功发布到SQL,sql id:100”,第二个:“你在吗?”)。

是否可以使用请求模块执行此操作,或者我需要在此处使用其他内容?

1 个答案:

答案 0 :(得分:0)

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

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

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