我在我的项目中使用了Django docker和AWS S3存储桶.我为我的存储桶配置了我的设置文件,它正在工作,但是在上传媒体文件时,我得到了一个错误,如果不是VALID_BUCKET.Search(存储桶)和VALID_S3_ARN.Search(存储桶),我得到一个错误,媒体文件"期望的字符串或类似字节的对象"和停靠日志(log)错误.我使用了Django表单和基于函数的视图.

Models.py

def user_directory_path(instance, filename):
    tenant = connection.get_tenant()
    return 'profile_photos/{0}/{1}'.format(tenant, filename)

class UserProfilePhoto(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profilephoto = models.ImageField(blank=True,default="profile_photos/profilephoto.png",upload_to=user_directory_path )

Views.py

def userprofile(request,id):
    get_object_or_404(User,id = id)
    if request.user.userprofile.status == 3 or str(request.user.id) == str(id):
            now_today =  datetime.now(pytz.timezone('Europe/Istanbul'))
            announcements=Announcements.objects.filter(announce_type="announcement")
            current_page="Kullanıcı Profili" 
            user=User.objects.filter(id=id).first() 
            user_doc_create=InsuranceFile.objects.filter(file_creator=user.username)
            user_doc_create_last_month=InsuranceFile.objects.filter(file_creator=user.username, created_at__gte=now()-relativedelta(months=1)).count()
            ratio_of_doc = ratio_utils(user_doc_create_last_month,user_doc_create.count())   
            user_doc_update=InsuranceFile.objects.filter(file_updater=user.id)
            user_doc_update_last_month=InsuranceFile.objects.filter(file_updater=user.id, updated_at__gte=now()-relativedelta(months=1)).count()
            ratio_of_doc_update = ratio_utils(user_doc_update_last_month,user_doc_update.count())    
            path_check=str("/account/userprofile/"+ id)
            profilephoto=UserProfilePhoto.objects.filter(user=request.user).first()
            previous_profilephoto=profilephoto.profilephoto
            form_user=CreateUserForm(request.POST or None , instance=request.user)
            form_userprofile=UserProfileForm(request.POST or None , instance=request.user.userprofile)
            form_userphoto=UserProfilePhotoForm(request.POST or None,request.FILES, instance=request.user.userprofilephoto,)
            is_confirmed=False
            if TOTPDevice.objects.filter(user_id=id).first():
                totp=TOTPDevice.objects.filter(user_id=id).first()
                is_confirmed=totp.confirmed
            if request.method == 'POST':
                if form_userphoto.is_valid() and form_userprofile.is_valid() and form_user.is_valid():
                    with transaction.atomic():
                        form_userprofile.save()
                        if str(request.FILES) != "<MultiValueDict: {}>":
    
                            upload_profile_photo(request,form_userphoto,user,previous_profilephoto)                             
                        messages.success(request,"Profil başarılı bir şekilde güncellendi.")
                        return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
            return render(request,'userprofile.html',{"now_today":now_today,"ratio_of_doc_update":ratio_of_doc_update,"user_doc_update_last_month":user_doc_update_last_month,"user_doc_update":user_doc_update,"announcements":announcements,"current_page":current_page,"user_doc_create_last_month":user_doc_create_last_month,"ratio_of_doc":ratio_of_doc,"user_doc_create":user_doc_create,"path_check":path_check,"profilephoto":profilephoto,"is_confirmed":is_confirmed,"user":user,"form_userprofile":form_userprofile,"form_userphoto":form_userphoto,"form_user":form_user})
    messages.warning(request,"Bu işlemi yapmaya yetkiniz bulunmamaktadır.")
    return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))

Upload*_Profile函数*

import boto3
def upload_profile_photo(request,form_userphoto,user,previous_profilephoto):
    s3 = boto3.client('s3',
            aws_access_key_id="AKIAW7UXTA7VBPUVLPGW",
            aws_secret_access_key= "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")   
     
    if previous_profilephoto !=  "profile_photos/profilephoto.png":      
        s3.delete_object(Bucket='dj-crm-tenant', Key= f'media/{previous_profilephoto}')
    form_userphoto.save() 

Settings.py

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_S3_CUSTOM_DOMAIN = 'dj-crm-tenant.s3.amazonaws.com'
AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'}
AWS_DEFAULT_ACL = 'public-read'
AWS_LOCATION = 'static'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
DEFAULT_FILE_STORAGE = 'dj_crm_tenant.storages.MediaStore'

Storages.py

from storages.backends.s3boto3 import S3Boto3Storage
class MediaStore(S3Boto3Storage):
    location = 'media'
    file_overwrite = False

当我试图更改我的用户资料照片时,我得到了一个错误.

我try 将文件上传到我的S3存储桶,但收到了前面提到的错误.

我正在try 使用Django-Forms和Boto将媒体文件上传到我的S3存储桶

我学习了https://github.com/veryacademy/YT-Django-Media-Static-AWS-S3教程

推荐答案

问题似乎与您的.env文件有关.您无法连接到您的存储桶,因为程序未读取您的密钥和ID.

您还可以安装dotenv包来管理您的环境文件.

Django相关问答推荐

自定义公钥打破Django管理内联逻辑

Django的update_or_create失败,尽管指定了kwargs'

Django迁移嵌套模型时出错,不带迁移基本模型

在Django管理中仅显示外键的特定值

django 无法识别实现自定义后端

相同的字符串不同的翻译

在 PyCharm 中运行 Django 测试

删除所有实例后,Django 模型实例主键不会重置为 1

Django:通过manage.py使用服务器和gunicorn等其他服务器之间的区别.哪个更好?

django - 如何在验证之前处理/清理字段

Django admin:我可以定义字段顺序吗?

如何使用 django 发送 POST 请求?

related_name 参数在 Django 模型中没有按预期工作?

has_object_permission 和 has_permission 有什么区别?

如何将我的上下文变量传递给 Django 中的 javascript 文件?

Django urls 直接到 html 模板

PyCharm 代码判断提示找不到模板文件,如何解决?

django 如何知道已经运行了哪些迁移?

在 Django 中查询 top x 元素

Django 测试客户端方法覆盖标头