【问题标题】:Streaming upload request?流式上传请求?
【发布时间】:2013-03-11 13:43:17
【问题描述】:

我正在 Python 中实现一个简单的上传处理程序,它将上传的文件以块的形式读取到内存、GZip 并对其进行签名,然后将它们重新上传到另一台服务器以进行长期存储。我已经设计了一种使用我的网络服务器分块读取上传的方法,基本上我有一个这样的工作流程:

class MyUploadHandler:

    def on_file_started(self, file_name):
        pass

    def on_file_chunk(self, chunk):
        pass

    def on_file_finished(self, file_size):
        pass

这部分效果很好。

现在我需要在对它们进行修改后将文件分块上传到最终目的地。我正在寻找一个有点像这样的工作流程:

import requests

class MyUploadHandler:

    def on_file_started(self, file_name):
        self.request = requests.put("http://secondaryuploadlocation.com/upload/%s" %
                (file_name,), streaming_upload = True)

    def on_file_chunk(self, chunk):
        self.request.write_body(transform_chunk(chunk))

    def on_file_finished(self, file_size):
        self.request.finish()

有没有办法使用 Python requests 库来做到这一点?似乎可以阅读they allow for file-like upload objects,但我不确定这到底意味着什么以及如何将其应用于我的情况。如何提供这样的流式上传请求?

【问题讨论】:

  • 你需要提供一个generator for chunked uploads,但是那个pulls数据;您的代码想要推送。我认为它需要一个单独的线程和一个队列。
  • 关于从哪里开始的任何想法?我的 Python 线程不太好。
  • 这部分取决于您为此使用的 Web 框架以及它如何处理并发。
  • 我应该为每次上传生成一个流氓线程以便同时重新上传文件吗?我什至不知道从哪里开始实施这一点。您能否在 Web 应用程序的上下文之外提供一个简化示例,用于通过生成器方法将推送数据转换为可拉取数据?

标签: python http python-requests


【解决方案1】:

我建议使用 Python 的多处理模块。您可以使用该模块中的 apply_async 例程在每个块完成后上传它们,而不会影响其他上传。然后,您可以将它们放在一个临时文件夹中,上传事件完成后,您可以将它们缝合在一起。

【讨论】:

    【解决方案2】:

    以下对类似问题的回答应该可以解决您的问题:

    问:“如何将 POST 数据流式传输到 Python 请求中?”

    A:示例代码使用 queuethreadingiter() 与哨兵

    https://stackoverflow.com/a/40018547/19163

    【讨论】:

    • 这应该是评论,而不是答案。如果这是一个重复的问题,那么vote to close 和/或在您earn 足够reputation 后发表评论。如果问题不是重复的,则针对此特定问题定制答案。
    • 我认为将其标记为重复会太苛刻,但我会按照你的建议做。
    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多