티스토리 뷰

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
최근에 올라온 글
Total
Today
Yesterday