运行并发pysftp命令的建议

2024-04-24 16:18:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我将pysftp与Django一起使用,我不知道如何以一种可以扩展一点的方式来实现这一点,这样我就可以让页面上的多个用户发出请求,而不会阻止他们,直到另一个用户的请求被服务。你知道吗

我试过这样的方法:

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

Tags: 用户命令self目录returnresponsedownloaddef
1条回答
网友
1楼 · 发布于 2024-04-24 16:18:22

我的一个项目需要类似的东西。
我编写了一个模块来处理通过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应用程序中的一个视图中。你知道吗

相关问题 更多 >