如何使用 Amazon S3 将默认图像添加到 django ImageField 以进行文件存储?

问题描述 投票:0回答:1

我制作了一个自定义用户模型,其中包含头像的图像字段:

class User(AbstractUser):
    avi_pic = models.ImageField(
        upload_to='avi/', default='avi/default_avi.jpg')
    username = models.CharField(max_length=30, unique=True)
    bio = models.CharField(max_length=150, null=True, blank=True, default='')

    def __str__(self):
        return self.username

我希望为所有新用户提供默认的 avi,因此我将图像添加到我的 AWS3 存储桶中,并将路径添加到模型字段。我的 S3 存储桶中该图像的路径是:

mybucket/media/avi/default_avi.png

要创建用户,我有一个 APIView:

class CreateUser(APIView):
    def post(self, request):
        serializer = UserRegisterSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

^ 注册新用户时仅提交用户名。

和模型序列化器:

class UserRegisterSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'username')

    def validate_username(self, value):
        if User.objects.filter(username=value).exists():
            raise serializers.ValidationError("Username is already taken.")
        allowed_characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-.'
        if any(char not in allowed_characters for char in value):
            raise serializers.ValidationError(
                "Invalid characters in username.")
        return value

我的问题是,当我创建新帐户时,用户没有获得默认图像。我已经这样配置了我的设置:

AUTH_USER_MODEL = 'users.User'

STATIC_URL = 'static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = 'https://MYBUCKET.s3.amazonaws.com/media'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']
AWS_S3_REGION_NAME = os.environ['AWS_S3_REGION_NAME']
AWS_S3_SIGNATURE_NAME = os.environ['AWS_S3_SIGNATURE_NAME']
AWS_S3_FILE_OVERWRITE = os.environ['AWS_S3_FILE_OVERWRITE']
AWS_DEFAULT_ACL = os.environ['AWS_DEFAULT_ACL']
AWS_QUERYSTRING_AUTH = os.environ['AWS_QUERYSTRING_AUTH']
AWS_S3_VERIFY = os.environ['AWS_S3_VERIFY']

我将其添加到我的项目主 urls.py 中:

urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

我遗漏了什么或配置错误吗? 另外,当我登录 Django 管理面板并转到用户时,它在 avi 图像字段旁边显示“未选择文件”。

python django amazon-s3 django-rest-framework
1个回答
0
投票

您说图像的路径是“mybucket/media/avi/default_avi.png”,但您默认插入了 .jpg 图像。

使用默认图像的正确路径修复用户模型:

avi_pic = models.ImageField(
        upload_to='avi/', default='avi/default_avi.png')

MEDIA_URL 应指向您的存储桶而不是 MEDIA_ROOT。从您的设置中删除 MEDIA_ROOT 并设置:

MEDIA_URL = 'https://MYBUCKET.s3.amazonaws.com/media/'

从您的网址中删除静态行。

urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)
© www.soinside.com 2019 - 2024. All rights reserved.