상세 컨텐츠

본문 제목

[django] AWS S3와 연동하기

DEVELOPMENT/django

by 김도훈 2020. 11. 26. 22:37

본문

반응형

기본적으로 AWS S3 bucket을 만들어 두었다고 가정하고 진행한다.

AWS S3

Simple Storage Service로, 미디어, 정적 파일을 공유할 수 있는 서비스이다.

 

적용하기

1. django 설정하기

django에서 S3를 연동시키기 위해서는 두가지 라이브러리를 설치해야한다.

pip install boto3
# boto3 : S3를 사용하기 위한 모듈이다.
pip install django-storages  
# django-storages : 다양한 저장소를 사용하기 위한 모듈이다.

즉, django-storages를 통해 boto3를 사용한다.

이렇게 라이브러리를 설치 했으면 settings.py를 설정해주어야 한다.

settings.py

# 작업환경에 따라 다를 수 있으니 주의
# 추가 기능 사용을 위해 다운받은 앱
THIRD_PARTY_APPS = [

storages, # 이 코드를 추가해준다.

]

    # 인스톨한 앱 = 기본 설치 앱 + 다운받은 앱 + 내가 설치한 앱
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + PROJECT_APPS

#############

# AWS
AWS_S3_ACCESS_KEY_ID = os.environ.get(
    "AWS_S3_ACCESS_KEY_ID"
)  # .csv 파일에 있는 내용을 입력 Access key ID
AWS_S3_SECRET_ACCESS_KEY = os.environ.get(
    "AWS_S3_SECRET_ACCESS_KEY"
)  # .csv 파일에 있는 내용을 입력 Secret access key
AWS_REGION = "ap-northeast-2"

###S3 Storages
AWS_STORAGE_BUCKET_NAME = os.environ.get("AWS_STORAGE_BUCKET_NAME")  # 설정한 버킷 이름
AWS_S3_CUSTOM_DOMAIN = "%s.s3.%s.amazonaws.com" % (AWS_STORAGE_BUCKET_NAME, AWS_REGION)
AWS_S3_OBJECT_PARAMETERS = {
    "CacheControl": "max-age=86400",
}

AWS_PUBLIC_MEDIA_LOCATION = "media/public"
DEFAULT_FILE_STORAGE = "config.asset_storage.MediaStorage"

AWS_PRIVATE_MEDIA_LOCATION = 'media/private'
PRIVATE_FILE_STORAGE = 'mysite.storage_backends.PrivateMediaStorage'


]

media파일

여기서 잠깐, Django에서 처리하는 데이터의 종류는 두 가지가 있다.(정적파일,동적파일) 이중 정적파일은 준비해둔 파일을 보여주는 static파일과 외부에서 사용자가 업로드하는 media파일로 나눌 수 있다. 간단한 설명에서 알 수 있듯이, media 파일이란 프로젝트에 업로드 되는파일을 말한다, 즉 media파일을 다루기 위해서 해야할 것이 있다.

  1. 업로드될 파일을 저장할 디렉토리경로 지정해주기
  2. url 지정

config > asset_storage.py

작업하고 있는 django project 폴더 config 폴더 안에 asset_storage.py 파일을 만든다.
그리고 그 안에 아래와 같이 내용을 채운다.

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage


class PublicMediaStorage(S3Boto3Storage):
    location = settings.AWS_PUBLIC_MEDIA_LOCATION
    file_overwrite = False


class PrivateMediaStorage(S3Boto3Storage):
    location = settings.AWS_PRIVATE_MEDIA_LOCATION
    default_acl = "private"
    file_overwrite = False
    custom_domain = False

models.py (예시파일)

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User

from mysite.storage_backends import PrivateMediaStorage


class Document(models.Model):
    uploaded_at = models.DateTimeField(auto_now_add=True)
    upload = models.FileField()


class PrivateDocument(models.Model):
    uploaded_at = models.DateTimeField(auto_now_add=True)
    upload = models.FileField(storage=PrivateMediaStorage())
    user = models.ForeignKey(User, related_name='documents'

각자의 모델에 맞게 views.py 파일을 설정하면 끝이다.

반응형

'DEVELOPMENT > django' 카테고리의 다른 글

[django] JWT 사용하기  (0) 2020.11.28
[django] restful-api 사용하기  (0) 2020.11.28
[django] seed 편하게만드는 방법, django_seed  (0) 2020.10.16
[django] 유저 다중모델  (0) 2020.10.16
[django] MySQL 연동하기  (0) 2020.10.16

관련글 더보기

댓글 영역