Python 如何将图像从django应用程序自动上载到aws s3

Python 如何将图像从django应用程序自动上载到aws s3,python,django,amazon-web-services,image,amazon-s3,Python,Django,Amazon Web Services,Image,Amazon S3,当用户在我的网站上创建或注册一个新帐户时,会创建(生成)一个图像并将其上传到s3 bucket。映像已成功创建(通过在服务器上的媒体目录中运行ls命令进行验证),但未上载到s3。但是,当我尝试从管理面板上载用户帐户的图像时,更改会正确地反映在s3中(即,来自管理面板的新上载图像显示在s3 bucket的目录中,但这是不可行的,因为用户无法获得管理面板访问权)。我的目标是在创建新帐户时自动将生成的图像上载到s3存储桶。 这里有一些相关的代码。 views.py models.py 设置.py 存储

当用户在我的网站上创建或注册一个新帐户时,会创建(生成)一个图像并将其上传到s3 bucket。映像已成功创建(通过在服务器上的媒体目录中运行ls命令进行验证),但未上载到s3。但是,当我尝试从管理面板上载用户帐户的图像时,更改会正确地反映在s3中(即,来自管理面板的新上载图像显示在s3 bucket的目录中,但这是不可行的,因为用户无法获得管理面板访问权)。我的目标是在创建新帐户时自动将生成的图像上载到s3存储桶。
这里有一些相关的代码。 views.py

models.py

设置.py

存储_backend.py

更新
与自动生成图像并将其上载到s3不同,如果我在注册表中上载任何图像,即使它成功上载到s3,唯一失败的情况是我需要在没有用户干预的情况下自动上载

请帮我解决这个问题。谢谢。

不要全局设置媒体存储设置,而是在字段中设置

class UserModel(models.Model):
    ...
    qr_gen = models.ImageField(upload_to='qrcodes',storage=MediaStorage())

我建议您看看是哪个自动化了所有这些,因此您应该只关注表单和视图,而不是其他任何东西。在这里,您可以找到有关如何轻松处理图像的帮助。

自动将图像直接上载到s3需要直接与s3的后端API通信。仅仅使用
django存储
或调整
DEFAULT\u FILE\u存储
路径是不够的,因为它只能帮助用户将上传的文件指向指定的s3存储桶/路径。可以使用
boto3
library的
upload\u file
方法解决此问题
用法示例:

参数: 文件名(str)——要上载的文件的路径。
密钥(str)——要上载到的密钥的名称。
ExtraArgs(dict)——可以传递给客户端操作的额外参数。

回调(函数)——一种方法,在上传过程中需要定期调用传输的字节数。我确实尝试过,但问题仍然存在。
class UserModel(models.Model):
   .
   .
   .
   qr_gen = models.ImageField(upload_to='qrcodes',default=None,null=True,blank=True)
DEFAULT_FILE_STORAGE = 'project.storage_backend.MediaStorage'
from storages.backends.s3boto3 import S3Boto3Storage


class MediaStorage(S3Boto3Storage):
    location = 'media'
    default_acl = 'public-read'
    file_overwrite = False
class UserModel(models.Model):
    ...
    qr_gen = models.ImageField(upload_to='qrcodes',storage=MediaStorage())
import boto3
s3 = boto3.resource('s3')
s3.Bucket('mybucket').upload_file('/tmp/hello.txt', 'hello.txt')