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

Python 如何在套接字完成之前从web套接字读取数据,python,request,tornado,Python,Request,Tornado,我正在尝试用Python构建客户机-服务器应用程序。 我的客户端使用请求模块连接到服务器并上传json和文件 服务器使用tornado框架。当服务器从客户端接收到数据时,它们开始处理并将结果按部分发送给客户端。 我的帖子处理程序示例: class PostAd(tornado.web.RequestHandler): def post(self): jdata = self.get_body_arguments('json', False)[0] jdata = json.lo

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

服务器使用tornado框架。当服务器从客户端接收到数据时,它们开始处理并将结果按部分发送给客户端。 我的帖子处理程序示例:

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服务器使用self.flush()命令向我发送数据时,我都需要检查返回的值(在我的示例中,我希望得到两个答案,第一个是:“成功发布到SQL,SQL id为100”,第二个是:“你在吗?”)


是否可以使用请求模块或我需要在此处使用其他功能?

我不知道是什么
agent.post()
是,但您可以使用tornado的HTTP客户端和
流式处理回调
选项来实现这一点。不过,您必须自己格式化请求正文,因为tornado没有内置的客户端支持多部分文件上载

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

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

需要更多代码。使用更多代码代理更新。post=requests.Session().post(),是否可以告诉tornado客户端需要接收的区块大小,以确保整个区块都已接收?否,tornado客户端的区块大小不可自定义。如果需要,您的应用程序负责将多个区块连接在一起。感谢您的解决方案,我正在学习异步编程,还有一个问题需要回答:Could请告诉我,如果我的tornado web客户端将在单独的线程中运行,我需要使用Wait创建它吗?不,tornado中没有线程。调用
fetch()时,您需要使用
wait
,而不是在创建客户端时。Tornado是一个单线程框架;您应该在IOLoop的线程上执行所有涉及Tornado对象的操作,例如AsyncHTTPClient。