Ere*_*ush 1 fork google-cloud-storage google-cloud-platform python-3.6
我正在尝试在 Linux 主机 (Ubuntu 18.04) 上的分叉进程中使用 Python SDK 将内容上传到 Google 存储桶操作失败,状态代码为 403:
google.api_core.exceptions.Forbidden: 403 POST https://www.googleapis.com/upload/storage/v1/b/temp-compare/o?uploadType=multipart :('请求失败,状态码',403,'预期之一', )
示例代码:
import random
import string
import json
import os
import requests
from datetime import datetime, timedelta
from google.cloud import storage
def upload_to_bucket(plainText):
gcp_client = storage.Client.from_service_account_json("/path/to/google-bucket-credentials.json")
bucket = gcp_client.get_bucket('bucket_name')
bucket_file_name = random_file_name('json', 10)
blob = bucket.blob(bucket_file_name)
blob.upload_from_string(plainText)
url = blob.generate_signed_url(expiration=datetime.utcnow() + timedelta(hours=48), method="GET")
return url
def random_file_name(ext, length):
return "%s.%s" % (''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(length)), ext)
if __name__ == "__main__":
os.fork()
url = upload_to_bucket("just for test")
res = requests.get(url)
print(res.content.decode('utf8'))
Run Code Online (Sandbox Code Playgroud)
我曾尝试使用google-api-python-client 中提供的解决方案因 OAuth2 损坏?没有锁。
如何解决这个问题?
毫不奇怪,事实证明我是问题的根源。在 fork 进程之后,创建的随机文件名random_file_name是相同的(可能与生成种子的方式有关)由于该帐户无权覆盖该文件,因此它会收到 403 响应。
如果我改为random_file_name:
def random_file_name(ext, length):
import uuid
return str(uuid.uuid4())[0:length]+"."+ext
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作。
如果不是@TasosZG 建议使用云外壳,我可能仍在寻找解决方案。
| 归档时间: |
|
| 查看次数: |
2890 次 |
| 最近记录: |