티스토리 뷰
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 |
댓글