Django Rest Framework에서 Amazon S3 파일을 다운로드하는 API 생성

전제 조건


  • AWS S3 읽기 권한이 있는 사용자 준비

  • AWS 명령줄 인터페이스을 사용하여 위의 사용자로 로그인했습니다.
    또한이 기사에서 다루는 언어 및 라이브러리 버전은 다음과 같습니다.
  • python-3.9.5
    Django==3.2.4
    djangorestframework==3.12.4
    boto3==1.17.91
    

    파일 준비



    AWS 콘솔에서 S3으로 들어가 적절한 파일을 버킷에 배치합니다.
    이번에는 test-qiita 버킷을 만들고 test.txt라는 텍스트 파일을 업로드했습니다.

    이 기사에서는 Django REST Framework를 사용하여이 test.txt를 다운로드하는 API를 만드는 것을 목표로합니다.

    API 준비



    먼저 최소한의 API를 엔드포인트를 준비해 둡시다.
    작성하는 API는 /api/file라는 URL에 GET 요청을 하는 사양으로 합니다.

    먼저 file_download_test라는 Django 프로젝트를 만들고,api라는 django 응용 프로그램을 만듭니다.
    $ django-admin startproject file_download_test
    $ django-admin startapp api
    

    그런 다음 api/views.py를 편집합니다.

    api/views.py
    from django.http import HttpResponse
    from rest_framework.views import APIView
    
    
    class FileView(APIView):
    
        def get(self, request):
            response = HttpResponse('ok')
            return response
    

    그리고 urls.py에서 URL과 FileView를 지원합니다.

    file_download_test/urls.py
    from django.contrib import admin
    from django.urls import path
    
    from api import views # 追加
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('api/file', views.FileView.as_view()), # 追加
    ]
    

    이상입니다.
    API를 사용해 봅시다.
    $ python .\manage.py runserver
    

    명령줄에서 실행하여 서버를 시작하고 브라우저에서 localhost:8000/api/file에 액세스합니다.


    이렇게 ok가 돌아오면 성공입니다.

    S3에서 파일 가져오기



    드디어 본제에 들어갑니다. 방금 만든 /api/file API를 S3 파일을 반환하도록 수정합니다.
    먼저 Python에서 AWS를 사용하는 데 자주 사용되는 라이브러리boto3를 설치합니다.
    $ pip install boto3
    

    boto3을 사용하기 위한 주의점



    boto3을 사용하여 AWS에 연결하려면 자격 증명이 필요합니다. AWS 명령줄 인터페이스으로 로그인하면 ~/.aws/credentials가 자동으로 만들어지고 그 내용은 다음과 같이 인증에 필요한 정보를 씁니다.

    credentials
    aws_access_key_id = ******************
    aws_secret_access_key = ************************
    

    boto3는 이 파일의 정보를 사용하여 AWS에 연결합니다.
    ※Docker 컨테이너의 경우 등~/.aws/credentials이 보이지 않는 경우는, 환경 변수에 이하의 이름으로 값을 설정해 주세요.
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

  • API 수정



    그런 다음 views.py를 다음과 같이 수정합니다.

    api/views.py
    import boto3
    from django.http import HttpResponse
    from rest_framework.views import APIView
    
    
    class FileView(APIView):
    
        def get(self, request):
            s3 = boto3.resource('s3')
            BUCKET_NAME = 'test-qiita'
            FILE_NAME = 'test.txt'
            object = s3.Object(BUCKET_NAME, FILE_NAME).get()
            response = HttpResponse(object['Body'].iter_chunks(), content_type=object['ContentType'])
            response['Content-Disposition'] = f'attachment; filename="{FILE_NAME}"'
    
            return response
    

    다시 브라우저에서 localhost:8000/api/file에 액세스하십시오.


    무사히 파일을 다운로드할 수 있었습니다!

    이번에 만든 파일은 여기에서 확인할 수 있습니다.

    좋은 웹페이지 즐겨찾기