python - 以 minio 作为后端的 Django-Storages S3
问题描述
我想将 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
设置.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'
也许有人已经这样做了?
解决方案
这是我为使其正常工作所做的工作
# 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 文档
AWS_S3_ENDPOINT_URL
(可选:默认为无,仅限 boto3)
连接到 S3 时使用的自定义 S3 URL,包括方案。覆盖AWS_S3_REGION_NAME
和AWS_S3_USE_SSL
。为避免 AuthorizationQueryParametersError 错误,AWS_S3_REGION_NAME
也应该设置。
故障排除
断开与 Internet 的连接并运行manage.py collectstatic
以查看 boto 无法连接的地址。
推荐阅读
- push-notification - 仅当新邮件进入 Gmail 收件箱时才会收到推送通知
- javascript - 当formatOnSave为真时,如何在Visual Studio代码中的javascript文件中格式化json?
- vb.net - 文件同步 Visual Studio 2015 报错
- html - 如何将一段文本与一堆可点击的精灵图像对齐在同一行?
- angular - 找不到“数字”类型的不同支持对象“1”。NgFor 仅支持绑定到 Iterables,例如 Arrays
- django - Django:在一段时间后更新模型属性
- javascript - 在斜杠(“/”)字符之前和之后反转字符串
- selenium - Selenium:如何断言图像显示在网页的某个部分下
- javascript - var {todo}= require("./models/todo"); 有什么区别?和 var todo=require("./models/todo");
- r - R Boot函数在包装在函数中时产生错误