Twisted、FTP 和“流式传输”大文件

2024-04-21

我正在尝试实现最能描述为“HTTP API 的 FTP 接口”的内容。本质上,有一个现有的 REST API 可用于管理站点的用户文件,并且我正在构建一个中介服务器,将该 API 重新公开为 FTP 服务器。因此,您可以使用 Filezilla 登录并列出您的文件、上传新文件、删除旧文件等。

我正在尝试这样做twisted.protocols.ftp对于 (FTP) 服务器,以及twisted.web.client对于 (HTTP) 客户端。

我遇到的问题是,当用户尝试下载文件时,该文件从 HTTP 响应“流式传输”到我的 FTP 响应。上传类似。

最直接的方法是从 HTTP 服务器下载整个文件,然后将内容发送给用户。这样做的问题是任何给定的文件都可能有很多 GB 大(例如驱动器映像、ISO 文件等)。不过,使用这种方法,在我从 API 下载文件和将其发送给用户之间,文件的内容将保存在内存中 - 不好。

所以我的解决方案是尝试“流式传输”它 - 当我从 API 的 HTTP 响应中获取数据块时,我只想转身并将这些数据块发送给 FTP 用户。Seems直截了当。

对于我的“自定义 FTP 功能”,我使用的是ftp.FTPShell。这个的读法,openForReading,返回一个 Deferred 并通过以下实现触发IReadFile http://twistedmatrix.com/documents/10.1.0/api/twisted.protocols.ftp.IReadFile.html.

下面是我的“streaming HTTP”的(初始的、简单的)实现。我用fetch函数来设置 HTTP 请求,并且我传入的回调会随着从响应中获得的每个块而被调用。

我想我可以使用某种两端缓冲区对象在 HTTP 和 FTP 之间传输块,方法是将缓冲区对象用作 FTP 所需的类文件对象ftp._FileReader http://twistedmatrix.com/documents/10.1.0/api/twisted.protocols.ftp._FileReader.html,但这很快就被证明是行不通的,因为来自send调用几乎立即关闭缓冲区(因为它返回一个空字符串,因为还没有数据可供读取等)。因此,我什至在开始接收 HTTP 响应块之前就“发送”了空文件。

我很接近,但错过了什么吗?我完全走错路了吗?是我想做的事really不可能(我非常怀疑)?

from twisted.web import client
import urlparse

class HTTPStreamer(client.HTTPPageGetter):
    def __init__(self):
        self.callbacks = []

    def addHandleResponsePartCallback(self, callback):
        self.callbacks.append(callback)

    def handleResponsePart(self, data):
        for cb in self.callbacks:
            cb(data)
        client.HTTPPageGetter.handleResponsePart(self, data)

class HTTPStreamerFactory(client.HTTPClientFactory):
    protocol = HTTPStreamer

    def __init__(self, *args, **kwargs):
        client.HTTPClientFactory.__init__(self, *args, **kwargs)
        self.callbacks = []

    def addChunkCallback(self, callback):
        self.callbacks.append(callback)

    def buildProtocol(self, addr):
        p = client.HTTPClientFactory.buildProtocol(self, addr)
        for cb in self.callbacks:
            p.addHandleResponsePartCallback(cb)
        return p

def fetch(url, callback):

    parsed = urlparse.urlsplit(url)

    f = HTTPStreamerFactory(parsed.path)
    f.addChunkCallback(callback)

    from twisted.internet import reactor
    reactor.connectTCP(parsed.hostname, parsed.port or 80, f)

顺便说一句,这只是我使用 Twisted 的第二天 - 我昨天花了大部分时间阅读 Dave Peticolas 的书扭曲简介 http://krondo.com/blog/?page_id=1327,这是一个很好的起点,即使基于旧版本的twisted。

这就是说,我may做错事。


我以为我可以使用某种两端缓冲区对象在 HTTP 和 FTP 之间传输块,方法是使用缓冲区对象作为 ftp._FileReader 所需的类文件对象,但这很快就被证明不起作用,因为发送调用的消费者几乎立即关闭缓冲区(因为它返回一个空字符串,因为还没有数据要读取等)。因此,我什至在开始接收 HTTP 响应块之前就“发送”了空文件。

您想要的不是使用 ftp._FileReader,而是每当有块从您的文件到达时就会执行写入操作。HTTPStreamer它提供的回调。您永远不需要/不想从 HTTP 上的缓冲区进行读取,因为甚至没有理由拥有这样的缓冲区。 HTTP 字节一到达,就将它们写入消费者。就像是...

class FTPStreamer(object):
    implements(IReadFile)

    def __init__(self, url):
        self.url = url

    def send(self, consumer):
        fetch(url, consumer.write)
        # You also need a Deferred to return here, so the 
        # FTP implementation knows when you're done.
        return someDeferred

您可能还想使用 Twisted 的生产者/消费者接口来限制传输,如果您与 HTTP 服务器的连接比用户与您的 FTP 连接更快,则可能需要这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Twisted、FTP 和“流式传输”大文件 的相关文章

  • Django 中的 Rpy2 错误 - 未为“”类型的对象定义转换“py2rpy”

    我以前从未使用过 R 并且正在尝试使用 rpy2 从 python 调用 R 函数 它可以在独立的 python 终端上运行 但不能在 Django 中运行 但rpy2似乎无法将python字符串转换为r对象 我正在使用同事提供的自定义库
  • 如何使用 conda 在一行中安装多个包?

    我需要使用 conda 安装以下多个软件包 我不确定 conda forge 是什么 有些使用 conda forge 有些不使用它 是否可以将它们安装成一行而不需要一一安装 谢谢 conda install c conda forge d
  • pandas Wide_to_long 后缀参数

    我对在 pandas 中使用 Wide to long 时的参数有疑问 有一个参数叫suffix我不明白 在文档中它说 后缀 str 默认 d 捕获所需后缀的正则表达式 d 捕获数字后缀 没有数字的后缀可以用否定字符类 D 指定 您还可以进
  • 如何在 Google App Engine 的 Python 中获取 StringProperty 的值?

    如何获取 nbd Model 的值 我想返回由多个字段组成的描述 但我无法让它工作 这是我的班级代码 class User ndb Model name ndb StringProperty email ndb StringProperty
  • 正则表达式,选择最接近的匹配

    假设以下单词序列 BLA text text text text text text BLA text text text text LOOK text text text BLA text text BLA 我想做的是将 BLA 中的文本
  • Pandas 连接问题:列重叠但未指定后缀

    我有以下数据框 print df a mukey DI PI 0 100000 35 14 1 1000005 44 14 2 1000006 44 14 3 1000007 43 13 4 1000008 43 13 print df b
  • Python 的 mysqldb 晦涩文档

    Python 模块 mysqldb 中有许多转义函数 我不理解它们的文档 而且我努力查找它们也没有发现任何结果 gt gt gt print mysql escape doc escape obj dict escape any speci
  • 将一维数组转换为下三角矩阵

    我想将一维数组转换为较低的零对角矩阵 同时保留所有数字 我知道numpy tril函数 但它用零替换了一些元素 我需要扩展矩阵以包含所有原始数字 例如 10 20 40 46 33 14 12 46 52 30 59 18 11 22 30
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • Python——捕获异常的效率[重复]

    这个问题在这里已经有答案了 可能的重复 Python 常见问题解答 异常有多快 https stackoverflow com questions 8107695 python faq how fast are exceptions 我记得
  • Pandas groupby apply 执行缓慢

    我正在开发一个涉及大量数据的程序 我正在使用 python pandas 模块来查找数据中的错误 这通常工作得非常快 然而 我当前编写的这段代码似乎比应有的速度慢得多 我正在寻找一种方法来加快速度 为了让你们正确测试它 我上传了一段相当大的
  • 使用 WSGI 在 Windows XAMPP 中设置 Python 路径

    我正在 Webfaction 上设置实时服务器的开发版本 在本地计算机上的虚拟 Apache 服务器环境 运行没有任何错误 中运行 Django 应用程序 XP 使用 Python 2 6 运行 XAMPP Lite 我可以提交更改通过 G
  • PyArmor - 打包为一个可执行文件

    当我执行此命令时 您好 使用 PyArmor pyarmor pack main py 它将它打包到一个名为的文件夹中dist里面包含我的 exe 以及许多 Python 扩展文件 据我所知 PyArmor 使用 PyInstaller 来
  • 根据第三个变量更改散点图中的标记样式

    我正在处理多列字典 我想绘制两列 然后根据第三列和第四列更改标记的颜色和样式 我很难改变 pylab 散点图中的标记样式 我的方法适用于颜色 不幸的是不适用于标记样式 x 1 2 3 4 5 6 y 1 3 4 5 6 7 m k l l
  • 用于多个窗口的 Tkinter 示例代码,为什么按钮无法正确加载?

    我正在编写一个程序 应该 按一下按钮即可打开一个窗口 按另一个按钮关闭新打开的窗口 我使用类 以便稍后可以将代码插入到更大的程序中 但是 我无法正确加载按钮 import tkinter as tk class Demo1 tk Frame
  • 在seaborn中对箱线图x轴进行排序

    我的数据框round data看起来像这样 error username task path 0 0 02 n49vq14uhvy93i5uw33tf7s1ei07vngozrzlsr6q6cnh8w 39 png 1 0 10 n49vq
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • Django Rest Framework POST 更新(如果存在或创建)

    我是 DRF 的新手 我阅读了 API 文档 也许这是显而易见的 但我找不到一个方便的方法来做到这一点 我有一个Answer与 a 具有一对一关系的对象Question 在前端 我曾经使用 POST 方法来创建发送到的答案api answe
  • 在 scipy 中创建新的发行版

    我试图根据我拥有的一些数据创建一个分布 然后从该分布中随机抽取 这是我所拥有的 from scipy import stats import numpy def getDistribution data kernel stats gauss
  • Python 中的字符串slugification

    我正在寻找 slugify 字符串的最佳方法 蛞蝓 是什么 https stackoverflow com questions 427102 in django what is a slug 我当前的解决方案基于这个食谱 http code

随机推荐

  • 保存为自动填充对话框未显示

    我有一个显示用户名 UI 的活动 输入该活动并点击继续按钮后会显示输入密码 UI 输入密码并点击登录按钮后 完成当前活动并启动新活动 在我的设备上 我选择了 Google 自动填充服务 因此在第一个活动完成后 我想要 保存以供自动填充 对话
  • Maven AppAssembler 找不到类

    尝试修改现有的 Java Tomcat 应用程序以按照其部署在 Heroku 上tutorial https devcenter heroku com articles create a java web application using
  • has_many :autosave => true 保存子项时跳过验证

    在 Rails 2 和 Rails 3 中 如果 autosave gt true 是一个 has many 关联 则循环遍历集合并对每个子关联调用 save validate gt false 这是为什么 我们需要为该子对象运行 befo
  • 创建 SKShapeNode 的子类

    class ColorRectangle SKShapeNode var width CGFloat var height CGFloat var rectColor UIColor convenience init rectOfSize
  • 使用 NSValueTransformer 加密 iOS 核心数据

    我正在尝试使用 Core Data 和 CommonCrypto 加密数据 我正在尝试使用 NSValueTransformer 来延迟加密和解密 但是 当我现在尝试将加密数据保存到持久存储协调器时 它失败了 每次我尝试将数据保存到数据库时
  • RecyclerView - 获取 Activity 内的位置而不是 RecyclerView 适配器

    这是我处理视图点击的第三天 我原来用的是ListView 然后我切换到RecyclerView 我已经添加了android onclick我的每个控件的元素row layout我正在处理它们MainActivity像这样 public vo
  • Moment js - 获取日期而不考虑时区

    我确实阅读了不同的 StackOverflow 帖子 他们建议从一开始就使用 utc 但它不起作用 Note 我在 PST 区域 const start 2018 06 10T21 00 00 04 00 const end 2018 06
  • MS2015中的MvcBuildViews需要很长时间

    我们正在转换解决方案以使用新的 Roslyn 编译器 当我在发布模式下通过 teamCity 构建它时 MVCBuildViews 步骤仍然使用 aspnet compiler exe 并且预编译视图需要大约 15 分钟 在 NET 4 5
  • Factory_girl 与 validates_presence_of 有关系

    我有 2 个型号 user rb class User lt ActiveRecord Base has one profile dependent gt destroy end profile rb class Profile lt Ac
  • Linux 中允许的 c/c++ 最大互斥体数量

    我一直在尝试找出 Linux 中 c c 进程的最大互斥体数量是多少 但没有成功 另外 有没有办法修改这个数字 我正在读的书提到了如何找到Linux中允许的最大线程数以及如何修改这个数字 但没有提到互斥体 检查这个pthread mutex
  • Django Postgresql 在迁移时删除列默认值

    我面临表默认值的问题 例如我有这个模型 class model1 models Model field1 models CharField max length 50 default My Default Value 1 db column
  • 如何完全静音 bash 脚本中的 vlc 输出?

    我有一个为自己编写的脚本 它在接近结束的地方使用 vlc 我需要它停止输出它想要的任何内容 但保留我自己的输出 所以没有 清除 我使用了参数 q 和 no sout x264 quiet 但无济于事 它仍然输出丑陋的消息 即 警告 调用 r
  • 使用两个具有相同命名空间的 .NET 库

    我目前正在为一家公司维护一些旧代码 正如所发生的那样 我正在修改的当前应用程序使用旧版本的内部库 我们将其称为 Lib1 dll 他们还有一个名为 Lib2 dll 的新版本库 它在许多方面对以前的库进行了改进 不幸的是 Lib2 不向后兼
  • VBS 脚本 getElementbyID 错误(自动登录脚本)

    我正在编写适用于不同站点的 vbs 脚本文件 但我正在为我的大学网页编写用于互联网页面登录的自动登录脚本 所以我一直在工作直到填写用户名和密码 但我无法让它点击登录 这是大学登录的链接 我不确定您是否可以从网络外访问它 请注意编辑请不要将其
  • 从 DataReader 读取数据的通用方法

    我目前正在使用此方法从 DataReader 读取数据 private T GetValue
  • LinkedList“节点跳转”

    试图找出为什么我的list 类指针被第三个节点覆盖 插入函数 如下 中发生的情况是 第三次调用插入函数headByName gt nextByName当第三个节点应该指向第二个节点时 节点指针被第三个节点覆盖 因此 您可以猜测第 4 个节点
  • 使用 Velocity 生成基于 HTML 的电子邮件

    我尝试这个教程http www java2s com Code Java Velocity UseVelocitytogenerateHTMLbasedemail htm http www java2s com Code Java Velo
  • Tensorflow:加载预训练 ResNet 模型时出错

    我想使用 Tensorflow 中预先训练的 ResNet 模型 我下载了code https github com tensorflow models blob master research slim nets resnet v1 py
  • 如何在 Qt 中实现 QHoverEvent?

    我正在学习 Qt 和 C 我已经成功地实现了信号和槽来捕获标准事件 例如ButtonPushed 等等 但是 我希望当我将鼠标悬停在鼠标上并移出鼠标时调用一个函数QLabel 看起来像QHover事件 http doc qt io qt 4
  • Twisted、FTP 和“流式传输”大文件

    我正在尝试实现最能描述为 HTTP API 的 FTP 接口 的内容 本质上 有一个现有的 REST API 可用于管理站点的用户文件 并且我正在构建一个中介服务器 将该 API 重新公开为 FTP 服务器 因此 您可以使用 Filezil