【问题标题】:Django-Storages S3 with minio as backend以 minio 作为后端的 Django-Storages S3
【发布时间】:2019-03-04 10:50:17
【问题描述】:

我想将 django-storages 与 minio 一起使用,所以我尝试采用设置、配置等。我在网上找到了,但由于某种原因,我的访问密钥或提供它的方式失败,并出现以下错误:

botocore.exceptions.ClientError: An error occurred (InvalidAccessKeyId) when calling the PutObject operation: The AWS Access Key Id you provided does not exist in our records.

如果我运行manage.py collectstatic

settings.py

#S3 config
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'MyProject/static'),
]
AWS_ACCESS_KEY_ID = '9VOWWCTSMX4ZEGVW7N9D'
AWS_SECRET_ACCESS_KEY = 'zJFf9BYWk0TM3FVwyY98UFy0o+DQF0oY1vCXgLqV'
AWS_STORAGE_BUCKET_NAME = 'static'
AWS_S3_CUSTOM_DOMAIN = '127.0.0.1:9000'

AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

AWS_LOCATION = 'static'
STATIC_URL = 'http://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

可能有人已经这样做了吗?

【问题讨论】:

  • 您可以添加您正在使用的文档/包链接吗?

标签: python django python-django-storages


【解决方案1】:

这是我为使其正常工作所做的工作

# settings.py

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

AWS_STORAGE_BUCKET_NAME = 'static'

AWS_ACCESS_KEY_ID = minio_access_key
AWS_SECRET_ACCESS_KEY = minio_secret_key
AWS_S3_ENDPOINT_URL = minio_address (eg. http://localhost:9000)

版本:

  • boto3==1.10.45
  • Django==3.0.1
  • django-storages==1.8
  • Minio==2019-12-26T01:55:09Z(从源代码构建的 Docker 映像可在 RPi4 上运行)

注意: 使用 pip install <package> 安装时为最新版本

我没有尝试使用django-minio-storage,因为它不支持 Django3。

如果您已升级软件包版本,请尝试我所做的。如果没有尝试设置S3_HOST = '127.0.0.1:9000'

AWS_S3_ENDPOINT_URL 来自django-storage docs

AWS_S3_ENDPOINT_URL(可选:默认为无,仅限boto3
连接到 S3 时使用的自定义 S3 URL,包括方案。覆盖 AWS_S3_REGION_NAMEAWS_S3_USE_SSL 。为避免出现 AuthorizationQueryParametersError 错误,还应设置AWS_S3_REGION_NAME

疑难解答
断开互联网并运行manage.py collectstatic 以查看boto 连接失败的地址。

【讨论】:

    【解决方案2】:

    为什么会出错?

    [这是一个假设]:您正在尝试使用 minio 凭据访问 minio 设置/内容。但是,django-storage 包在 aws s3 的 API 上使用它。


    如果您尝试使用 minio,您应该使用 minio backed,这可以通过使用 django-minio-storage

    我在生产环境中借助 django-minio-storage 实现了媒体存储和静态存储,并且可以无缝运行。


    我的 django-minio 配置设置

    DEFAULT_FILE_STORAGE = 'minio_storage.storage.MinioMediaStorage'
    STATICFILES_STORAGE = 'minio_storage.storage.MinioStaticStorage'
    MINIO_STORAGE_ENDPOINT = '127.0.0.1:9000'
    MINIO_STORAGE_STATIC_BUCKET_NAME = "static"
    STATIC_URL = f'https://{MINIO_STORAGE_ENDPOINT}/{MINIO_STORAGE_STATIC_BUCKET_NAME}/'
    MINIO_STORAGE_USE_HTTPS = True
    MINIO_STORAGE_AUTO_CREATE_MEDIA_BUCKET = True
    MINIO_STORAGE_AUTO_CREATE_STATIC_BUCKET = True
    
    MINIO_STORAGE_ACCESS_KEY = #your ACCESS_KEY
    MINIO_STORAGE_SECRET_KEY = # Your SECRET_KEY
    MINIO_STORAGE_MEDIA_BUCKET_NAME = "media"
    

    【讨论】:

    • Oookay :D 你能把你的 minio 后端存储配置发给我吗?我也尝试过,但媒体存储有问题。也许只是因为我在 django 2.x 上
    • 文档说:Django 1.8-1.11。所以看来我在这里:(
    • 除此之外,django-minio doc 非常简单,你可以尝试一下
    • @Venom 我已经用我的 minio 设置更新了答案
    • 切换后端不需要你实现另一个库,尤其是当它们都使用相同的协议时。
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 2014-01-21
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2012-05-06
    相关资源
    最近更新 更多