首页 > 解决方案 > 运行并发 pysftp 命令的建议

问题描述

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

我正在使用pysftpDjango,但我不确定如何以一种可以扩展的方式实现这一点,这样我就可以在页面上让多个用户发出请求,而不会阻止他们,直到另一个用户的请求得到服务。

我试过这样的事情:

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()

标签: pythondjangopysftp

解决方案


我的一个项目需要类似的东西。
我编写了一个模块来处理通过 SSH 列出和读取远程服务器上的文件。
不同之处在于它没有使用pysftpbut 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


推荐阅读