본문 바로가기
Django

파일 삭제하면 미디어 폴더에서도 파일 삭제하기

by Django_ 2020. 4. 14.
반응형

첫 프로젝트를 만들면서 가장 걱정이 되는 부분은 아무래도 서버 관리가 아닐까 싶습니다.

파이썬 기반 장고의 경우 ORM 및 Gunicorn과 같이 간편하게 서버와 DB를 운용할 수 있도록 지원해줍니다.

실제 서비스가 진행되면 데이터를 함부로 지울 수 없기 때문에 처음에 세팅해두는 것이 중요하다고 생각이 들었습니다.

텍스트의 경우 크게 걱정이 되질 않았지만 파일과 이미지는 걱정이 많이 되었습니다.

 

저장 공간도 비용! 트래픽도 비용! 유지도 비용! 다 비용입니다.

 

그런데 장고의 경우 파일을 업로드하고 지우더라도 데이터 베이스에서는 지워지더라도 파일은 그대로 남아 있게 됩니다.

지웠다고 모든 내용과 파일이 지워지는 것도 큰일이기 때문에 해당 정책이 맞다고는 생각하지만 그래도 필요한 경우가 상당히 많이 있습니다.

 

우선 2가지 방법을 많이 사용하는 것 같습니다.

1. 데코레이터

2. 오버 라이딩

(작동하는지는 꼭! 직접 확인해보세요)

from django.db.models.signals import post_delete
from django.dispatch import receiver

class MyModel(TimeStampedModel):
    field_name = models.FileField()

@receiver(post_delete, sender=MyModel)
def file_delete_action(sender, instance, **kwargs):
    instance.field_name.delete(False)
class MyModel(TimeStampedModel):

   field_name = models.FileField()
   
   def delete(self, *args, **kwargs):
        super(MyModel, self).delete(*args, **kwargs)
        os.remove(os.path.join(settings.MEDIA_ROOT, self.field_name.path))

취향에 따라 사용하시면 좋을 것 같습니다.

추가적인 실험이 필요하겠지만 오버 라이딩의 경우 delete( ) 함수가 호출되어야 하며 모델 때문인지 뷰때문인지 경우에 따라 폴더에서 삭제가 안 되는 모델이 있었습니다. (오류 나면 그냥 데코로 변경했거든요)

혹시 이 내용을 자세히 아시는 분은 댓글로 함께 공유해주시면 감사하겠습니다~!

반응형

댓글