【问题标题】:Pipe Twisted Request Content to STDIN of Process将 Twisted 请求内容管道传输到进程的 STDIN
【发布时间】:2016-06-10 20:58:03
【问题描述】:

我希望将 HTTP POST 或 PUT 的内容通过管道传输到进程的 STDIN。我正在使用 Klein 库并具有以下代码:

from klein import run, route
from twisted.internet import reactor, defer, protocol    
import os

class CurlProcProtocol(protocol.ProcessProtocol):
    def __init__(self, data):
        self.data = data

    def connectionMade(self):
        self.transport.write(self.data)
        self.transport.closeStdin()

    def outReceived(self, data):
        return 'got ' + str(data)

@route('/')
def home(request):
    d = defer.Deferred()

    reactor.spawnProcess(CurlProcProtocol(request.channel),
                         '/usr/bin/curl',
                         args=['curl', '-T', '-', 'ftp://localhost/test.txt'],
                         env={'HOME': os.environ['HOME']},
                         usePTY=False)

    d.addCallback(reactor.run)

    return d

run("localhost", 8080)

我正在努力解决的问题是我将Request 的哪一部分传递给我的CurlProcProtocol,然后又如何将它传递给self.transport

【问题讨论】:

    标签: python twisted twisted.web twisted.internet


    【解决方案1】:

    我最终抛弃了 Klein,只选择了 Twisted

    from twisted.web import server, resource
    from twisted.internet import reactor, protocol
    
    import os
    
    
    class CurlProcProtocol(protocol.ProcessProtocol):
        def __init__(self, request):
            self.request = request
    
        def connectionMade(self):
            self.transport.write(self.request.content.read())
            self.transport.closeStdin()
    
            self.request.write("Done!\n")
            self.request.finish()
    
        def outReceived(self, data):
            print 'GOT: ' + str(data)
    
    
    class Simple(resource.Resource):
        isLeaf = True
    
        def render_POST(self, request):
    
            reactor.spawnProcess(CurlProcProtocol(request),
                                 '/usr/bin/curl',
                                 args=['curl', '-T', '-', 'ftp://localhost/test.txt'],
                                 env={'HOME': os.environ['HOME']},
                                 usePTY=False)
    
            return server.NOT_DONE_YET
    
    
    site = server.Site(Simple(), logPath='access.log')
    reactor.listenTCP(8080, site)
    reactor.run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 2021-10-15
      相关资源
      最近更新 更多