我正在寻求有关运行并发pysftp应用程序接口命令的建议,例如列出目录中的文件并从服务器下载它们。似乎当我测试它的时候,所有的请求都会被阻塞,直到前一个请求完成。
我在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()发布于 2019-01-04 07:47:43
我的一个项目需要类似的东西。
我编写了一个模块,通过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应用程序中的一个视图中。
https://stackoverflow.com/questions/54031025
复制相似问题