python - 运行并发 pysftp 命令的建议
问题描述
我正在请求有关运行并发pysftp
API 命令的建议,例如列出目录中的文件并从服务器下载它们。似乎当我对此进行测试时,所有请求都被阻止,直到前一个请求完成。
我正在使用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()
解决方案
我的一个项目需要类似的东西。
我编写了一个模块来处理通过 SSH 列出和读取远程服务器上的文件。
不同之处在于它没有使用pysftp
but 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
。
推荐阅读
- visual-studio-code - 支持 VS 代码扩展 DLT 日志的 DLT 二进制文件
- powerbi - 查找第二个日期的 DAX 公式 - Power BI
- design-patterns - 将单词和模式之间的行移动到文件末尾
- sql - SQL oracle 检查可用日期
- excel - 如果列标题匹配,如何将数据从 csv 表复制到 excel 表
- rust - 如何在 Rust 的串行端口箱中使用 read_line 函数
- css - 强制图像匹配 Tailwind 中父 flexbox 的尺寸
- locale - 设置 Altair FormatLocale 不起作用
- aws-lambda - CORS 策略已阻止从“源”“获取”的访问权限:请求的资源上不存在“Access-Control-Allow-Origin”标头
- r - twitchr::get_videos 在 `vec_slice_impl()` 中给出内部错误:意外的 `NULL`