CLOUD/Public Cloud

[AWS] S3 : Django에 저장되던 이미지 > S3에 저장하기

alsruds 2023. 3. 15. 13:38

》 Django 기능 이용

 

[ AWS : S3 ]

》 버킷 만들기

2023.03.15 - [분류 전체보기] - [Cloud] S3 : 버킷 내 객체 공유하기

 

[Cloud] S3 : 버킷 내 객체 공유하기

● S3 : 클라우드 스토리지 》 확장성 》 가용성 》 용량을 쓴 만큼 비용 지불 ● S3 vs. EBS 》 S3 : 컴퓨터가 없어도 사용 가능 → 객체 스토리지 : 수평적인 파일 관계, 특정 url로 접근 가능 》 EBS : E

alsrudalsrudalsrud.tistory.com

 

[ Django ]

》 PyCharm Project 이용

 

● Django project 생성 + 기본 세팅

#장고 설치
pip install django

#설정 파일 만들기
django-admin startproject config .

#앱 추가
python .\manage.py startapp app01

 

● Django 에 DB 연결

① 리눅스 설정

#mysql-server 설치
yum install mysql-server

#mysql 실행
systemctl start mysqld
systemctl enable mysqld
mysql -u root

#연동할 데이터베이스 생성
create database [데이터베이스명];

#계정 생성
create user '[사용자명]'@'%' identified by '[비밀번호]';

#권한 주기
grant all privileges on [데이터베이스명].* to '[사용자명]'@'%';

#재시작
systemctl restart mysqld

#방화벽 해제
systemctl stop firewalld
systemctl disable firewalld

 

② Django 설정

 설치

pip install boto3 django-storages

 

settings.py 파일 설정

#INSTALLED_APPS
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01', #추가했던 앱
    'storages', #s3 연동
]

#DATABASES
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '[데이터베이스명]',
        'USER': '[사용자명]',
        'PASSWORD': '[비밀번호]',
        'HOST': '[db server ip]',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': 'SET sql_mode="STRICT_TRANS_TABLES"'
        }
    }
}

#S3 연동
AWS_REGION = 'ap-northeast-2'  #사용지역 (서울 : ap-northeast-2)
AWS_STORAGE_BUCKET_NAME = '[S3에서 만든 버킷명]'
AWS_ACCESS_KEY_ID = '[액세스 키ID]'
AWS_SECRET_ACCESS_KEY = '[액세스 키-secret access key]'

AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (AWS_STORAGE_BUCKET_NAME, AWS_REGION)

#Static Setting
STATIC_URL = "https://%s/static/" % AWS_S3_CUSTOM_DOMAIN
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

#Media Setting
MEDIA_URL = "https://%s/media/" % AWS_S3_CUSTOM_DOMAIN
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

≫ 액세스 키 발급 : 우측 상단 이름 클릭 보안 자격 증명 액세스 키 만들기

 

》 명령어 실행

python .\manage.py collectstatic

 

이미지 업로드 / 조회 기능 추가

#models.py
class Picture(models.Model):
    img = models.ImageField(upload_to="image", blank=True)
#urls.py
urlpatterns = [
	#이미지 업로드
    path('img/',app01.views.img),
    path('img_up/',app01.views.img_upload),
    
	#이미지 조회
    path('img_down/',app01.views.img_download),
]
#views.py
def img(request): #이미지 저장 페이지 불러오기
    return render(request, 'img_up.html')

def img_upload(request): #이미지 저장
    image = request.FILES.getlist("image")
    for img in image:
        s3_img = Picture()
        s3_img.img = img
        s3_img.save()
    return redirect('/img_down/')

def img_download(request): #이미지 조회
    result = Picture.objects.all()
    info = {"result" : result}
    return render(request, 'img_down.html',info)
#img_up.html
<body>
    <form action="/img_up/" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="file" multiple name="image">
        <button type="submit">upload</button>
    </form>
</body>
#img_down.html
<body>
    {% if result %}
        {% for img in result %}
            <img src="https://[버킷명].s3.[사용지역].amazonaws.com/{{img.img}}" alt="">
        {% endfor %}
    {% endif %}
</body>

 

 

☞ 확인하기 ☜

Django 에서 이미지 업로드, 조회 시 S3에 이미지 저장

S3 에 저장 완료~