Dstargram project - 5

[ Dstargram project ]

aws S3를 이용하여 이미지 파일을 저장하고

해당 글을 삭제했으나, S3에는 이미지가 삭제되지 않음

signal을 사용하여 S3에도 이미지가 삭제되도록 변경

  • signal
    • ~하기 전에, ~한 후에 발생하는 일들을 말함
    • 후속 조치를 하는 것
    • 대표적인 signal 종류
      • pre_save : 저장하기 전
      • post_save : 저장한 후
      • pre_delete : 지우기 전
      • post_delete : 지운 후
    1. 어떤 시그널이 발생했을 때 반응할 것인지 생각해야 한다.
    2. 그 시그널이 발생한 것을 어떻게 알았는지 생각해야 한다.
    • views.py에 추가
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      from django.db.models.signals import post_delete
      from django.dispatch import receiver

      import boto3
      from django.conf import settings

      # @receiver(어떤 시그널이 발생했는가?, 누가 발생시켰는가?)
      # sender가 없다면 모든 경우에 post_delete가 발생
      # sender=Photo를 해줌으로써 Photo가 있는 경우에만 발생
      @receiver(post_delete, sender=Photo)
      def post_delete(sender, instance, **kwargs):
      session = boto3.Session(
      aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
      aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
      region_name=settings.AWS_REGION
      )

      # s3.Objects는 s3에 업로드된 파일 객체를 얻어오는 클래스
      # arg1 = 버킷네임
      # arg2 = 파일 경로 - Key
      s3 = session.resource('s3') # s3 권한 가져오기
      image = s3.Object(settings.AWS_STORAGE_BUCKET_NAME, "media/"+str(instance.image))
      image.delete()

[ Board project ]

  • DB는 AWS RDS - postgreSQL로 만들기(Postgre 10.x ver.)
  • url이 있는 형태로 S3 버킷 만들기(static 파일용)

    1. 장고 프로젝트 생성

      • pycharm에서 board_project를 생성 후, 진행

        1
        2
        3
        $ pip install django

        django-admin startproject config .
      • 관련 모듈을 미리 설치하자.

        1
        2
        3
        4
        5
        $ pip install psycopg2-binary

        $ pip install boto3

        $ pip install django-storages
    2. AWS RDS에 DB 만들기(Postgre 10.7 사용)

      • 파라미터 그룹은 Postgre 10으로 새로 생성하여 사용한다.
      • DB 세부 정보를 지정할 때만 DB 엔진 버전을 PostgreSQL 10.7을 선택한다.
      • 나머지는 dstagram_project와 동일하게 진행했다.
      • pycharm project의 settings.py를 수정한다.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        # config/settings.py
        # 기존 데이터베이스 항목을 수정
        DATABASES = {
        'default': {
        # psycopg2 - binary 이용
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        # Amazon 해당 DB의 구성 - DB 이름
        'NAME': 'board',
        # Amazon database 생성 때 작성한 마스터 사용자 이름
        'USER': 'amazon master user name',
        # Amazon database 생성 때 작성한 마스터 암호
        'PASSWORD': 'amazon master password',
        # Amazon 해당 DB의 연결&보안 - 엔드포인트
        'HOST': 'wps10-board.cnuxbldx8kex.ap-northeast-2.rds.amazonaws.com',
        # # Amazon database 생성 때 포트
        'POST': '5432',
        }
        }
      • DB를 초기화하고 관리자 계정을 생성하여 확인한다.

        1
        2
        3
        4
        5
        $ python manage.py migrate

        $ python manage.py createsuperuser

        $ python manage.py runserver
    3. AWS S3에 static 파일용 버킷 만들기

      • board.[도메인 주소]로 버킷 이름을 설정한다.
      • 퍼블릭 ACL 관리 체크 항목을 모두 해제한다.
      • 버킷이 생성되면 속성 탭에서 정적 웹 사이트 호스팅을 활성화한다.
      • AWS ROUTE53에서 레코드를 생성한다.
      • pycharm project의 settings.py를 수정한다.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        AWS_ACCESS_KEY_ID = 'Amazon User Access Key ID 값' # 반드시 지우고 github에 올려야한다.
        AWS_SECRET_ACCESS_KEY = 'Amazon User Secret Key 값' # # 반드시 지우고 github에 올려야한다.
        AWS_REGION = 'ap-northeast-2'
        AWS_STORAGE_BUCKET_NAME = 'board.jinukk.me'
        AWS_S3_CUSTOM_DOMAIN = '%s' % AWS_STORAGE_BUCKET_NAME
        AWS_S3_SECURE_URLS = False # https -> http
        AWS_S3_OBJECT_PARAMETERS = {
        'CacheControl': 'max-age=86400',
        }
        AWS_DEFAULT_ACL = 'public-read'
        AWS_LOCATION = 'static'

        STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
        STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
      • 다음 명렁어를 통해 Amazon S3에 static 관련 파일을 옮긴다.

        1
        2
        $ python manage.py collectstatic
        # 명령어 입력 후, yes를 한번 더 입력한다.
      • Amazon S3의 해당 버킷에 static 파일이 옮겨졌는지 확인하자.

Share