我需要运行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()
答案 0 :(得分:0)
我的一个项目需要类似的东西。
我编写了一个模块,用于处理通过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
应用中的其中一个视图中。