返回非空的gcs存储桶“只能将str(不是“字节")连接到str". [英] Not null gcs bucket returned "can only concatenate str (not "bytes") to str"

查看:65
本文介绍了返回非空的gcs存储桶“只能将str(不是“字节")连接到str".的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对Google Clould存储空间非常陌生.我正在使用教程 https://cloud.google.com/storage/docs/boto-插件以使用boto为Google云存储创建存储区.请在下面找到代码:

I am very new to google clould storage. I am using tutorial https://cloud.google.com/storage/docs/boto-plugin to create a bucket to google cloud storage using boto. Please find code below:

    import boto
    import gcs_oauth2_boto_plugin
    import time

    GOOGLE_STORAGE = 'gs'
    LOCAL_FILE = 'file'

    CLIENT_ID = "hnsdndsjsksoasjmoadsj"
    CLIENT_SECRET = "jdijeroerierper-er0erjfdkdf"

    gcs_oauth2_boto_plugin.SetFallbackClientIdAndSecret(CLIENT_ID, CLIENT_SECRET)

    now = time.time()

    # Your project ID can be found at https://console.cloud.google.com/
    # If there is no domain for your project, then project_id = 'YOUR_PROJECT'
    project_id = 'my-project-4749485'


    now = time.time()
    CATS_BUCKET = 'cats-%d' % now
    DOGS_BUCKET = 'dogs-%d' % now

    for name in (CATS_BUCKET, DOGS_BUCKET):
      uri = boto.storage_uri(name, GOOGLE_STORAGE)
      try:
        header_values = {"x-goog-project-id": project_id}
        uri.create_bucket(headers=header_values)

        print('Successfully created bucket "%s"' % name)
      except boto.exception.StorageCreateError as e:
        print('Failed to create bucket:', e)

当我运行它时,我得到:

When I run it I get:

/Users/dilipyadav/githome/elrond/venv/bin/python /Users/dilipyadav/githome/elrond/elrond/deploy3.py -t test -v 0.0.1
Traceback (most recent call last):
  File "/Users/dilipyadav/githome/elrond/elrond/deploy3.py", line 28, in <module>
    uri.create_bucket(headers=header_values)
  File "/Users/dilipyadav/githome/elrond/venv/lib/python3.7/site-packages/boto/storage_uri.py", line 574, in create_bucket
    storage_class)
  File "/Users/dilipyadav/githome/elrond/venv/lib/python3.7/site-packages/boto/gs/connection.py", line 95, in create_bucket
    data=get_utf8_value(data))
  File "/Users/dilipyadav/githome/elrond/venv/lib/python3.7/site-packages/boto/s3/connection.py", line 659, in make_request
    auth_path = self.calling_format.build_auth_path(bucket, key)
  File "/Users/dilipyadav/githome/elrond/venv/lib/python3.7/site-packages/boto/s3/connection.py", line 94, in build_auth_path
    path = '/' + bucket
TypeError: can only concatenate str (not "bytes") to str

Process finished with exit code 1

我在这里发现了类似的问题-

I found similar issue here - Can't collectstatic to s3 via Heroku using boto - s3 bucket returns a NoneType, but it did not help.

注意:CLIENT_ID,CLIENT_SECRET和project_id已替换为随机字符.

Note: CLIENT_ID, CLIENT_SECRET and project_id are replaced with random characters.

    def build_auth_path(self, bucket, key=''):
        key = boto.utils.get_utf8_value(key)
        path = ''
        if bucket != '':
            path = '/' + bucket
        return path + '/%s' % urllib.parse.quote(key)

上面是来自connection.py的代码片段,其中我的代码失败了.在调试时,我得到的存储桶名称为"cats-1567682436",这是一个字节值.我想用字符串"/"和字节存储桶创建路径时会失败.因此串联失败.

The above is a code snippet from connection.py where my code fails. On debugging I get bucket name as "cats-1567682436" which is a byte value. I guess it's failing when the path is created with string '/' and byte bucket. So concatenation fails.

推荐答案

更改此行:

path = '/' + bucket

对此:

path = '/' + bucket.decode('utf-8')

但是,我将更改调用build_auth_path()的代码,并首先将存储区bytearray转换为string,然后再调用build_auth_path().

However, I would change the code that calls build_auth_path() and convert the bucket bytearray to a string first and then call build_auth_path().

这篇关于返回非空的gcs存储桶“只能将str(不是“字节")连接到str".的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆