【问题标题】:Advice for running concurrent pysftp commands运行并发 pysftp 命令的建议
【发布时间】:2019-01-03 23:06:36
【问题描述】:

我正在请求有关运行并发pysftp API 命令的建议,例如列出目录中的文件并从服务器下载它们。似乎当我测试这个时,所有请求都被阻止,直到前一个完成。

我在 Django 中使用pysftp,但我不确定如何以一种可以稍微扩展的方式实现这一点,这样我就可以让页面上的多个用户发出请求而不会被阻止,直到另一个用户请求已送达。

我尝试过这样的事情:

class sftp:
    def __init__(self):
        self.response = HttpResponse()
        self.cnopts = pysftp.CnOpts()
        self.cnopts.hostkeys = None
    def download(self):
        with pysftp.Connection('host.exmaple.com', username='user1', password='test_password',
                               cnopts=self.cnopts) as sftp:
            sftp.getfo(
                '/var/lib/stuff/file.mp3',
                self.response)
            self.response['Content-Type'] = 'audio/mp3'
        return self.response

那么在我看来,我会这样称呼:

return sftp().download()

【问题讨论】:

    标签: python django pysftp


    【解决方案1】:

    我的一个项目需要类似的东西。
    我编写了一个模块来处理通过 SSH 列出和读取远程服务器上的文件。
    不同之处在于它不是使用pysftp,而是paramiko,但我猜它应该可以完成这项工作。

    import paramiko
    
    
    class SSHClient:
        __slots__ = ['transport', 'sftp']
    
        def __init__(self, host, user, passw, port):
            """Init connection to SFTP server.
            Args:
                host (str): Server IP address
                user (str): Server username
                passw (str): Server password
                port (int): connection port
            """
            self.transport = paramiko.Transport((host, port))
            self.transport.connect(username=user, password=passw)
            self.sftp = paramiko.SFTPClient.from_transport(t=self.transport)
    
        def __enter__(self):
            return self
    
        def __exit__(self, exception_type, exception_value, traceback):
            """Close SFTP connection"""
            self.transport.close()
            self.sftp.close()
    
        def list_files(self, remote_path) -> list:
            """List files from specific server directory.
            Args:
                remote_path (str): SFTP server path directory.
            Returns:
                list of files & folders in directory.
            """
            return self.sftp.listdir(path=remote_path)
    
        def read_remote_file(self, remote_path, filename):
            """Read remote file content from server.
            Args:
                remote_path (str): SFTP server path.
                filename (str): name of file.
            """
            return self.sftp.open(
                filename='{path}/{file}'.format(path=remote_path, file=filename),
                mode='r'
            )
    
        def close_conn(self) -> None:
            """Close SFTP connection"""
            self.transport.close()
            self.sftp.close()
    

    然后,您可以使用使用 read_remote_file() 获取的内容将文件下载到您的 Django 应用程序中的一个视图中。

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 2012-10-28
      • 2020-08-10
      • 2015-05-21
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2023-03-10
      相关资源
      最近更新 更多