Python 将图像从aws s3 bucket加载到django应用程序
我制作了一个django应用程序,它存储了不同学期和分支的笔记,我想在我的网站主页上,在他们的名字旁边显示上传者的个人资料图像。我直接使用S3存储桶中的静态文件 用户上载的注释存储在notes/models.py中,而用户的配置文件及其配置文件图像存储在users/models.py中 我想做的是在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
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
。