クライアントからファイルを受け取り、それらを処理し、ファイルと結果ディクショナリを返すツイストxmlrpcサーバーをセットアップしようとしています。
私は以前にPythonを使用しましたが、ツイストライブラリは使用していません。私の目的では、セキュリティは問題ではなく、sshプロトコルはやり過ぎのようです。利用できないため、Windowsサーバーでも問題が発生しtermios
ます。
したがって、私の研究はすべて、xmlrpcがこれを達成するための最良の方法であることを示しています。ただし、ファイル転送には2つの方法があります。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だからですか?