如何使用 python-swiftclient 在 OpenStack 中创建临时 url?
How to create temporary url in OpenStack using python-swiftclient?
我正在使用 python-swiftclient to connect to an OpenStack Object Store. Following some examples from the documentation 我现在可以上传文件了:
container = 'new-container'
local_file_path = 'file.txt'
conn = Connection(**OBJECT_STORE_INFO)
with open(local_file_path, 'r') as local:
r = conn.put_object(
container,
local_file_path,
contents=local.read(),
content_type='application/zip'
)
print("File created")
效果很好,我现在想为该文件创建一个临时文件 url。在我发现 the function generate_temp_url() 的来源中,它至少需要四个参数:路径、秒、键、方法
对于路径,the documentation says:
:param path: The full path to the Swift object or prefix if
a prefix-based temporary URL should be generated. Example:
/v1/AUTH_account/c/o or /v1/AUTH_account/c/prefix.
我找不到这条路。我尝试了几个变体(我的本地路径,我从网络界面获得的文件的 url)但没有任何效果。我可以获得关于文件headers的
resp_headers = conn.head_object(container, local_file_path)
哪个returns这个:
{'content-length': '12', 'accept-ranges': 'bytes', 'last-modified': 'Wed, 10 Feb 2021 16:10:19 GMT',
'etag': '4d79d5df13513c295916112b9b3e25e0', 'x-timestamp': '1612973418.28837',
'content-type': 'text/plain', 'x-trans-id': 'tx045dc3b415374a81a9a80-00602407c4',
'date': 'Wed, 10 Feb 2021 16:20:20 GMT', 'age': '0', 'via': 'our.objectstore.com'}
但这并没有显示任何有用的信息。
在this documentation中给出了以下示例:
Example: /v1/AUTH_account/c/o or: http://saio:8080/v1/AUTH_account/c/o
直接url到我的文件是:https://8d078638c1a547c09e0b5f34834554f1.ourobjectstore.com/new-container/file.txt
所以这与示例中的 url 完全不同。
有人知道这里发生了什么吗?我在哪里可以找到这个所谓的“路径”,以便我可以创建临时文件 url?
最后@RakshaSaini 写了第一条评论,将我指向the official documentation here。它包含一个不起作用但足够接近的示例。我对其进行了如下调整,现在对我们有用了:
import hmac
from hashlib import sha1
from time import time
method = 'GET'
duration_in_seconds = 60 * 60 * 24 # 24 hours
expires = int(time() + duration_in_seconds)
path = '/new-container/file.txt'
key = b'the-temp-url-key'
hmac_body = f'{method}\n{expires}\n{path}'.encode('utf-8')
sig = hmac.new(key, hmac_body, sha1).hexdigest()
url = f'https://tenantid.ourobjectstore.com{path}?temp_url_sig={sig}&temp_url_expires={expires}'
print("URL", url)
我正在使用 python-swiftclient to connect to an OpenStack Object Store. Following some examples from the documentation 我现在可以上传文件了:
container = 'new-container'
local_file_path = 'file.txt'
conn = Connection(**OBJECT_STORE_INFO)
with open(local_file_path, 'r') as local:
r = conn.put_object(
container,
local_file_path,
contents=local.read(),
content_type='application/zip'
)
print("File created")
效果很好,我现在想为该文件创建一个临时文件 url。在我发现 the function generate_temp_url() 的来源中,它至少需要四个参数:路径、秒、键、方法
对于路径,the documentation says:
:param path: The full path to the Swift object or prefix if
a prefix-based temporary URL should be generated. Example:
/v1/AUTH_account/c/o or /v1/AUTH_account/c/prefix.
我找不到这条路。我尝试了几个变体(我的本地路径,我从网络界面获得的文件的 url)但没有任何效果。我可以获得关于文件headers的
resp_headers = conn.head_object(container, local_file_path)
哪个returns这个:
{'content-length': '12', 'accept-ranges': 'bytes', 'last-modified': 'Wed, 10 Feb 2021 16:10:19 GMT',
'etag': '4d79d5df13513c295916112b9b3e25e0', 'x-timestamp': '1612973418.28837',
'content-type': 'text/plain', 'x-trans-id': 'tx045dc3b415374a81a9a80-00602407c4',
'date': 'Wed, 10 Feb 2021 16:20:20 GMT', 'age': '0', 'via': 'our.objectstore.com'}
但这并没有显示任何有用的信息。
在this documentation中给出了以下示例:
Example: /v1/AUTH_account/c/o or: http://saio:8080/v1/AUTH_account/c/o
直接url到我的文件是:https://8d078638c1a547c09e0b5f34834554f1.ourobjectstore.com/new-container/file.txt
所以这与示例中的 url 完全不同。
有人知道这里发生了什么吗?我在哪里可以找到这个所谓的“路径”,以便我可以创建临时文件 url?
最后@RakshaSaini 写了第一条评论,将我指向the official documentation here。它包含一个不起作用但足够接近的示例。我对其进行了如下调整,现在对我们有用了:
import hmac
from hashlib import sha1
from time import time
method = 'GET'
duration_in_seconds = 60 * 60 * 24 # 24 hours
expires = int(time() + duration_in_seconds)
path = '/new-container/file.txt'
key = b'the-temp-url-key'
hmac_body = f'{method}\n{expires}\n{path}'.encode('utf-8')
sig = hmac.new(key, hmac_body, sha1).hexdigest()
url = f'https://tenantid.ourobjectstore.com{path}?temp_url_sig={sig}&temp_url_expires={expires}'
print("URL", url)