首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行并发pysftp命令的建议

运行并发pysftp命令的建议
EN

Stack Overflow用户
提问于 2019-01-04 07:06:36
回答 1查看 212关注 0票数 0

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

我在Django上使用pysftp,我不确定如何以一种可伸缩的方式实现这一点,这样我就可以让页面上的多个用户发出请求,而不会被阻塞,直到另一个用户的请求得到服务。

我尝试了这样的东西:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
return sftp().download()
EN

回答 1

Stack Overflow用户

发布于 2019-01-04 07:47:43

我的一个项目需要类似的东西。

我编写了一个模块,通过SSH处理远程服务器上的列表和读取文件。

不同的是,它使用的不是pysftp,而是paramiko,但我猜它应该可以完成这项工作。

代码语言:javascript
复制
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应用程序中的一个视图中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54031025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档