티스토리 뷰

python django

custom field 생성

내일은 뭐할까 2019. 7. 24. 00:21
class VideoField(models.URLField):
    """
    Custom Video Field
    """
    def __init__(self, *args, **kwargs):
        super(VideoField, self).__init__(*args, **kwargs)

        aws = ServiceSetting.objects.first().social_key.get('aws')

        if aws is not None and aws.get('access_key_id') == '' and aws.get('secret_access_key') == '':
            self.access_key_id = AWS_ACCESS_KEY_ID
            self.secret_access_key = AWS_SECRET_ACCESS_KEY
            self.bucket_name = f'버킷이름1'
        else:
            self.access_key_id = ServiceSetting.objects.first().social_key['aws']['access_key_id']
            self.secret_access_key = ServiceSetting.objects.first().social_key['aws']['secret_access_key']
            self.bucket_name = f'버킷이름2'

    def pre_save(self, model_instance, add):
        value = getattr(model_instance, self.attname)

        if type(value) != str:

            # 원본 파일 업로드
            s3_resource = boto3.resource('s3',
                                         aws_access_key_id=self.access_key_id,
                                         aws_secret_access_key=self.secret_access_key)
            s3_client = boto3.client('s3',
                                     aws_access_key_id=self.access_key_id,
                                     aws_secret_access_key=self.secret_access_key)
            # 원본 그대로 s3에 업로드
            value.name = get_filename(value.name)

            s3_resource.Object(self.bucket_name, f'input/{value.name}').put(Body=value.file)
            s3_client.put_object_acl(ACL='public-read', Bucket=self.bucket_name, Key=f'input/{value.name}')
            url = f'https://{self.bucket_name}.s3.amazonaws.com/input/{value.name}'

            if add:
                upload_video_task(value)
            else:
                old_value = model_instance.tracker.previous(self.attname)
                if old_value is not None and value != old_value:
                    key = f"output/{old_value.split('input/')[-1]}"
                    delete_video_task(key, self.access_key_id, self.secret_access_key, self.bucket_name)
                upload_video_task(value)

            setattr(model_instance, self.attname, url)
        else:
            url = value
        return url

 

__init__ method: 초기값 설정

pre_save: db에 동영상 파일 경로가 save되기전 pre_save가 동작하게 됩니다.

 

__init__method에선 aws 관련 key값 유무에 따라서 초기 key값으로 할지, 관리자 페이지에 저장된 key값으로 할지를 판단합니다.

 

전반적으로 동영상 파일 관련 커스텀 필드이며 upload_video_task에서는 인코딩 관련 로직을 실행합니다.

'FileField'를 사용할 수 있지만 동영상 파일 인코딩 작업이 들어가기 때문에 'VideoField'를 커스텀하게 추가로 생성했습니다.

 

'python django' 카테고리의 다른 글

celery를 사용한 파일 업로더  (0) 2019.12.17
FlexFieldsModelSerializer  (0) 2019.07.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함