Создание подписанного URL-адреса для объекта в облачном хранилище с использованием python - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь сгенерировать подписанный URL-адрес для объекта в облачном хранилище, используя python.

import datetime as dt
ini_time_for_now = dt.datetime.now() 
expiration_time = ini_time_for_now + dt.timedelta(minutes = 15) 
print(expiration_time)

client = storage.Client()
bucket = client.get_bucket(bucketname)
blob = bucket.blob(pdffolder) 
blob.upload_from_filename(pdffilename)

url = blob.generate_signed_url('cred.json', bucketname,pdffolder,expiration=expiration_time)

Я получаю эту ошибку.

Traceback (most recent call last):
File "entryscript.py", line 18, in <module>
main()
File "entryscript.py", line 13, in main
testpdf(sys.argv[0], sys.argv[1])

File "/home/xxxx/GitHub/patch_python/local_test_scripts/patchQuick/Instant_analysis/test.py", line 504, in testpdf

url = blob.generate_signed_url('cred.json', bucketname, 
pdffolder,expiration=expiration_time) 
TypeError: generate_signed_url() got multiple values for argument 'expiration'`

Кто-нибудь может сказать мне, что я делаю не так.

Ответы [ 3 ]

1 голос
/ 23 июня 2020

Надеюсь, это кому-то поможет.

  1. Перейдите к API и службам -> Учетные данные -> Создать учетные данные -> Учетная запись службы -> укажите имя соответствующей учетной записи службы и назначьте администратора облачного хранилища как роль. Загрузите ключ (. json файл)

  2. Перейдите в сегмент облачного хранилища и убедитесь, что на вкладке разрешений в сегменте присутствует учетная запись службы, созданная выше. Если нет, нажмите «Добавить участников», добавьте созданную выше учетную запись службы и назначьте роль администратора облачного хранилища.

  3. Используйте код, указанный выше @FerVelvet, и получите подписанный URL.

1 голос
/ 21 июня 2020

На самом деле ваш код не будет работать, поскольку вы неправильно используете метод generate_signed_url() в соответствии с его документацией . Кроме того, я думаю, вы путаете метод generate_signed_url для объекта blob с показанным здесь примером метода :

def generate_signed_url(service_account_file, bucket_name, object_name,
                       subresource=None, expiration=604800, http_method='GET',
                       query_parameters=None, headers=None):

Еще одна вещь, которую вы должны учитывать, это то, что дата истечения срока должна быть в UT C.

Следующий код создает Signed URL из уже созданного объекта, но вы можете изменить он соответствует вашим требованиям:

from google.oauth2 import service_account
from google.cloud import storage
from datetime import datetime, timezone, timedelta

#Define the service account key and project id
KEY='path/to/key.json'
PROJECT='PROJECT_ID'

#create a credential to initialize the Storage client
credentials = service_account.Credentials.from_service_account_file(KEY)
client = storage.Client(PROJECT,credentials)

#Define your Storage bucket and blob
bucketname = "BUCKET_NAME"
file = "BLOB_NAME"

#Get the time in UTC
ini_time_for_now = datetime.now(timezone.utc)

#Set the expiration time
expiration_time = ini_time_for_now + timedelta(minutes = 1) 

#Initialize the bucket and blob
bucket = client.get_bucket(bucketname)
blob = bucket.get_blob(file)

#Get the signed URL
url = blob.generate_signed_url(expiration=expiration_time)

#Print the URL
print (url)
0 голосов
/ 26 июня 2020

Я столкнулся с той же ошибкой - по какой-то причине URL-адреса, которые я возвращался для тестирования, имели & HTML, закодированное в &amp;, что вызывало эту ошибку. будет той же проблемой для вас, но на всякий случай.

...