Python 将图像从aws s3 bucket加载到django应用程序

Python 将图像从aws s3 bucket加载到django应用程序,python,django,amazon-web-services,amazon-s3,Python,Django,Amazon Web Services,Amazon S3,我制作了一个django应用程序,它存储了不同学期和分支的笔记,我想在我的网站主页上,在他们的名字旁边显示上传者的个人资料图像。我直接使用S3存储桶中的静态文件 用户上载的注释存储在notes/models.py中,而用户的配置文件及其配置文件图像存储在users/models.py中 我想做的是在home.html(以下)中使用如下内容:, {%static post.uploader.profile.image.url%}但它突然不起作用 设置.py AWS\u访问\u密钥\u ID='XX

我制作了一个django应用程序,它存储了不同学期和分支的笔记,我想在我的网站主页上,在他们的名字旁边显示上传者的个人资料图像。我直接使用S3存储桶中的静态文件

用户上载的注释存储在notes/models.py中,而用户的配置文件及其配置文件图像存储在users/models.py中

我想做的是在
home.html
(以下)中使用如下内容:,
{%static post.uploader.profile.image.url%}
但它突然不起作用

设置.py

AWS\u访问\u密钥\u ID='XXXXXXXXXXXXXXXX' AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxx' AWS_存储_存储_BUCKET_NAME='django-XXXXX' AWS\u S3\u地区\u NAME=“ap-south-1” AWS\u S3\u签名\u VERSION=“s3v4” AWS_S3_文件_覆盖=False AWS\u默认值\u ACL=无 #s3静态设置 AWS_位置='静态文件' AWS_S3_CUSTOM_DOMAIN=f'{AWS_STORAGE_BUCKET_NAME}.S3.amazonaws.com' STATIC_URL=f'https://{AWS_S3_CUSTOM_DOMAIN}/{AWS_LOCATION}/' STATICFILES_STORAGE='storages.backends.s3boto3.s3boto3存储' #s3公共媒体设置 公共媒体位置='MEDIA' 媒体URL=f'https://{AWS_S3_自定义_域}/{PUBLIC_媒体位置}/' 默认_文件_存储='django_项目.STORAGE_backends.PublicMediaStorage' #s3专用媒体设置 私有\媒体\位置='PRIVATE' PRIVATE_FILE_STORAGE='django_project.STORAGE_backends.PrivateMediaStorage' 默认文件存储='storages.backends.s3boto3.s3boto3存储' notes/models.py

class Notes\u模型(models.Model):
“”“存储不同分支和学期的笔记。”“”
上传器=models.CharField(最大长度=200)
title=models.CharField(最大长度=200)
date\u posted=models.DateTimeField(auto\u now\u add=True)
description=models.TextField(最大长度=2500)
branch\u choice=models.CharField(最大长度=50,选项=branch\u choices,默认值=cse)
文件\学期=模型.IntegerField(选项=学期\选项)
file=models.FileField()
教学大纲=models.TextField(最大长度=200,默认值='没有教学大纲可用')
定义(自我):
返回自己的标题
def get_绝对_url(自身):
返回反向(“notes detail”,kwargs={“pk”:self.pk})
users/models.py

来自django.db导入模型的

从django.contrib.auth.models导入用户
从PIL导入图像
类配置文件(models.Model):
user=models.OneToOneField(用户,on_delete=models.CASCADE)
image=models.ImageField(default='default.svg',上传到'profile-pics')
定义(自我):
返回(f'{self.user.username}配置文件')
def保存(自我):
super.save()
img=Image.open(self.Image.path)
如果img.height>300或img.width>300:
输出_大小=(300300)
图像缩略图(输出大小)
保存(self.image.path)
home.html

{%extends“base.html”%}
{%block content%}
{%load static%}
{posts%%中的post为%s}

{{post.content}

{%endfor%}
AWSS3 bucket中的xml表示不存在密钥,但它存在于bucket中


NoSuchKey
指定的密钥不存在。
静态文件/
960CD372E7128E16
90tvY+TT6FKEFEHEXUTOLV5T8FCVJSDZIOBPAM8INZ4GGDHPB9QXRKTOCL/3yN+69TJOUYQO=
返回的Url是:

然而它应该是

返回的预期url:

问题:

您使用的是
{%static%}
模板标记,用于非静态文件。这是一个媒体文件。
post.uploader.profile.image.url的值应为图像作为媒体资产的实际url。将该URL传递给
{%static%}
会尝试将URL作为静态资产的名称查找,这就是为什么会出现
NoSuchKey
错误的原因。

好的,我同意这是一个媒体文件,但对于不同的用户,即使我使用
{post.uploader.profile.image.URL}
时,它也不起作用。怎么办“不行“什么意思?是否为该配置文件上载了图像,这意味着该图像不是
None
?是否存在
default.svg
default?媒体文件的存储桶配置是否正确?不工作意味着图像没有从S3存储桶加载到我的网站前端。问题的原因似乎是
I,因为我无法在
img
中设置正确的路径。你对此有什么见解吗?是的,S3存储桶配置正确。还有一件事:
DEFAULT\u FILE\u STORAGE
定义了两次。第二个赢了,所以看起来您没有正确配置存储桶,因为您没有使用
PublicMediaStorage
类,而是使用(我假设)基类
S3Boto3Storage