【问题标题】:Using twisted to process files使用twisted处理文件
【发布时间】:2012-07-18 15:43:17
【问题描述】:

我正在尝试设置一个扭曲的 xmlrpc 服务器,它将接受来自客户端的文件,处理它们,并返回一个文件和结果字典。

我以前使用过 python,但从来没有使用过扭曲的库。出于我的目的,安全性不是问题,而 ssh 协议似乎有点过头了。它在 Windows 服务器上也有问题,因为 termios 不可用。

所以我所有的研究都指向 xmlrpc 是实现这一目标的最佳方式。但是,有两种可用的文件传输方法。使用xml binary data 方法或http request 方法。

无论哪种方式,文件都可以达到几百兆,那么我应该使用哪种方法?示例代码表示赞赏,因为我找不到通过扭曲的 xml 进行文件传输的文档。

更新:

所以似乎用xmlrpclib.Binary 序列化文件不适用于大文件,或者我用错了。测试代码如下:

from twisted.web import xmlrpc, server

class Example(xmlrpc.XMLRPC):
    """
    An example object to be published.
    """

    def xmlrpc_echo(self, x):
        """
        Return all passed args.
        """
        return x

    def xmlrpc_add(self, a, b):
        """
        Return sum of arguments.
        """
        return a + b

    def xmlrpc_fault(self):
        """
        Raise a Fault indicating that the procedure should not be used.
        """
        raise xmlrpc.Fault(123, "The fault procedure is faulty.")

    def xmlrpc_write(self, f, location):
        with open(location, 'wb') as fd:
            fd.write(f.data)

if __name__ == '__main__':
    from twisted.internet import reactor
    r = Example(allowNone=True)
    reactor.listenTCP(7080, server.Site(r))
    reactor.run()

以及客户端代码:

import xmlrpclib
s = xmlrpclib.Server('http://localhost:7080/')
with open('test.pdf', 'rb') as fd:
    f = xmlrpclib.Binary(fd.read())
s.write(f, 'output.pdf')

我在测试时得到xmlrpclib.Fault: <Fault 8002: "Can't deserialize input: ">。是不是因为文件是pdf?

【问题讨论】:

    标签: python xml twisted file-transfer


    【解决方案1】:

    XML-RPC 对于文件传输来说是一个糟糕的选择。 XML-RPC 要求以 XML 支持的方式对文件内容进行编码。这在运行时成本和网络资源方面都很昂贵。相反,请尝试使用普通的旧 HTTP POST 或 PUTing 文件。

    【讨论】:

    • 啊,但是我需要对文件做一些事情,然后返回修改后的文件。如何通过 POST 请求发送选项,然后返回结果文件?
    • HTTP 请求可以有响应。在响应中发回生成的文件。 HTTP 请求还具有请求 URL、标头和任意正文。您可以将这些“选项”粘贴在其中任何一个中。 URL 中的查询参数是一种流行的简单选项。
    • 阿格尔!我通常不是网络人,所以所有可用的工具都是新的。我也试图在大约 4 小时内完成这一切。所以,我将去阅读关于 HTTP 请求的扭曲文档。我将不胜感激。
    • 嗯,你说得对,HTTP 更简单。我已经针对我遇到的问题发布了另一个问题,所以我会接受这个答案作为解决方法。
    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多