Django를 처음 써보는 초보자 기억 복기용이므로 틀린 부분이 있을 수 있습니다.
다른 블로그에서 S3환경 설정하는 부분은 많이 나와있기 때문에 다루지 않습니다.
S3에서 이미지 다운로드, 업로드를 API로 만드는 것을 목적으로 한 포스팅입니다.
IDE : Pycharm
프레임 워크 설정
1. Preferences => Project => Python Interpreter에서 djangorestframework 추가
2. settings.py => REST_FRAMEWORK 부분 추가, INSTALLED_APPS에 'rest_framework' 추가
S3 연동해 API 만들기
[1]
터미널에서 pip명령어를 통해 아래 두 가지를 설치한다.
S3 연동 패키지 설치 : pip install boto3
다양한 저장소 이용: pip install django-storages
[2]
Settings.py에 S3 정보 추가
# Static files (CSS, JavaScript, Images)
STATIC_URL = '/static/'
AWS_ACCESS_KEY_ID = '엑세스 키'
AWS_SECRET_ACCESS_KEY = '엑세스 Secret 키'
AWS_REGION = 'ap-northeast-2'
###S3 Storages
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',
}
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
[3]
아래 나오는 aws configure 명령어로 S3정보를 입력해준다.
[4]
[ 2021.4.12 수정:
Django 버전에 따라 path, include 에서 오류가 날 수 있는데 이때는 from django.conf.urls import url, include 사용
url('admin/', admin.site.urls) 형식으로 사용하면 된다. ]
url 설정을 해야하는데 ulrs.py가 두개가 있다.
일단 앱[내 경우 ImageFilter]의 urls.py에 원하는 url을 적는다.
임시로 만들 hello라는 API와 실제로 S3와 연동할 API인 download 두개를 적었다.
from django.urls import path, include
from .views import helloAPI, download
urlpatterns = [
path("hello/", helloAPI),
path("download/", download)
]
그 이후 상위에 있는 urls.py에 imageFilter라는 url을 추가해준다.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('imageFilter/', include('imageFilter.urls'))
]
이 두 과정을 거치면 실행시 http://localhost:8888/imageFilter/hello/
이런식으로 url 구조를 만들 수 있다.
[5]
실제 API를 만들려면 views.py 파일에 코드를 작성해야 한다. (python에서는 view가 controller의 개념이라고 한다..)
해당코드를 실행하면 아래와 같은 화면을 볼 수 있다.
@csrf_exempt
@api_view(['GET'])
def helloAPI(request):
return Response("hello world")
[6]
POST로 두 개의 인자를 받아 S3에서 이미지를 가져온다. => s3.download_file함수를 이용
이미지 필터링 후 이미지를 다시 S3에 업로드 한다. => s3.upload_file함수를 이용
S3구조가 버킷명/film_uid/photo_uid로 되어있기 때문에 /%d/%d.jpeg 로 가져왔지만 다른 구조면 이 코드도 수정해야 한다.
원래 response값이랑 다른 처리들도 필요한데 정말 기본적인 것만 코드로 작성해보았다. [추후 업데이트 예정]
@csrf_exempt
@api_view(['POST'])
def download(request):
data = JSONParser().parse(request)
film_uid = data['film_uid']
photo_uid = data['photo_uid']
s3 = boto3.client('s3')
# 버킷 이름 / 다운로드 할 객체 지정 / 다운로드할 위치와 파일명
s3.download_file(AWS_STORAGE_BUCKET_NAME,
'%d/%d.jpeg' % (film_uid, photo_uid),
'%d.jpeg' % photo_uid)
image = cv2.imread("%d.jpeg" % photo_uid, 1) # 1 color, 2 grayscale, -1 alpha channel 포함
cv2.imwrite("%d_edited.jpeg" % photo_uid, gammaImage(image, 1.5))
# 업로드 할 파일 / 버킷 이름 / 업로드될 객체
s3.upload_file('%d_edited.jpeg' % photo_uid,
AWS_STORAGE_BUCKET_NAME,
'%d/%d_edited.jpeg' % (film_uid, photo_uid))
S3 CLI
CLI를 사용하려면 awscli를 pip로 설치해야 한다
S3 서버 설정(SecretKey, region 등 설정): aws configure
S3 버킷 보기 : aws s3 ls
** configure 설정을 필수로 해주어야 S3 연동이 제대로 동작함
S3 버킷 파일 목록 보기 : aws s3 ls s3://버킷명
S3 버킷에서 로컬로 다운로드 : aws s3 cp s3://버킷명/폴더명/파일명 원하는 파일명(절대경로)
'잡다구리 > 웹 & 서버' 카테고리의 다른 글
Django+Docker 이미지 만들어 배포하기 (0) | 2021.04.12 |
---|---|
[CSS] inline, block, inline-block (0) | 2020.12.18 |
[CSS] 서식관련 속성 (0) | 2020.10.28 |
Vue.js 프로젝트 생성 및 실행 (0) | 2020.09.19 |