我目前正在处理的项目要求我在Openstack云实例上上传和下载swift对象存储文件。我拥有登录Openstack实例所需的所有API信息,但我无法弄清楚如何在python中使用swiftclient。
我特意尝试使用python内部的swiftclient,而不是swift命令行界面。我需要能够响应快速操作期间发生的异常。
我目前尝试连接和发布容器的行为如下:
try:
opts = dict(tenant_id=<tenant id value>, region_name=<region name>)
swift_conn = swiftclient.client.Connection(authurl=<auth url>, user=<username>, key=<password>, tenant_name=<tenant name>, os_options=opts)
swift_conn.post_container(cont)
swift_conn.close()
except swiftclient.exceptions.ClientException:
print(traceback.format_exc())
这会失败,因为post_container方法至少需要一个标头值。我无法找出构成swift请求的有效标头的内容。
更重要的是,我不确定这是执行快速操作的正确方法。我已经阅读了文档(http://docs.openstack.org/developer/python-swiftclient/swiftclient.html#module-swiftclient.exceptions)和源代码(https://github.com/openstack/python-swiftclient/blob/master/swiftclient/client.py),但发现两者都有点迟钝。虽然有一些方向可以确定哪些方法以及它们需要什么参数,但是执行通用swift操作没有明确的操作顺序。
如果有人能就此的一般过程提供一些建议或指导,我们将不胜感激。我可以将解决方案挤出到post_container请求,以解决我自己在其余操作中遇到的问题。
答案 0 :(得分:2)
我通过大量的反复试验找到了自己问题的答案。我遇到的主要陷阱是没有向 Connection 对象提供 auth_version 参数。如果未提供 auth_version 参数,则默认为1.0,并且调用的 get_auth_1_0 方法会重建错误的网址并失败。
一般的 put_object 操作对于那些希望使用python-swiftclient并运行这个问题的人来说是这样的:
swift_conn = swiftclient.client.Connection(authurl='<url>', user='<user>', key='<password>', tenant_name='<tenant name>', auth_version='2.0', os_options={'tenant_id': '<tenant id>', 'region_name': '<region name>'})
swift_conn.put_object(<container name>, <object name>, <data>)
swift_conn.close()
此代码假定您拥有Openstack实例所需的信息,并且您正在使用特定区域。
一般 get_object 操作如下所示:
swift_conn = swiftclient.client.Connection(authurl='<url>', user='<user>', key='<password>', tenant_name='<tenant name>', auth_version='2.0', os_options={'tenant_id': '<tenant id>', 'region_name': '<region name>'})
response, object_body = swift_conn.get_object(<container name>, <object_name>)
swift_conn.close()
f = open(<filename>, 'wb')
f.write(object_body)
f.close()
此代码获取一个对象并将其内容保存到文件中。
希望我所处于相同位置的人发现这很有用。
答案 1 :(得分:0)
借用GMeier的回答并稍微修改磁盘上的现有文件:
LEFT
获取是GMeier答案的直接副本:
open_file = open('path/to/file').read()
swift_conn = swiftclient.client.Connection(authurl='<url>', user='<user>', key='<password>', tenant_name='<tenant name>', auth_version='2.0', os_options={'tenant_id': '<tenant id>', 'region_name': '<region name>'})
swift_conn.put_object(<container name>, <object name>, contents=open_file, content_type='add/type')
swift_conn.close()
您可以从openstack配置文件openrc.sh获取所有连接信息。