군침이 싹 도는 코딩

사진과 글을 DB에 저장하는 API 본문

Python/Flask

사진과 글을 DB에 저장하는 API

mugoori 2023. 1. 13. 11:18

# 사진과 글을 동시에 DB에 저장하는 API를 만들어보자

조건은 사진과 글 모두를 꼭 올려야하며 사진이 아닌 파일은 올릴수없게 만든다

메소드는 데이터를 바디에 보내야하므로 POST를 써주고

사진과 글은 form-data로 받아오게 설계한다

 

 

 

 

class PostingResource(Resource) :

    def post(self) :

        
        # 사진과 내용은 필수항목이다
        if 'photo' not in request.files or 'content' not in request.form :
            return {'error':'데이터를 정확히 보내세요'}, 400

        # 클라이언트로부터 데이터 받아온다
        # form-data 
        # photo : file 
        # content : text

        file = request.files['photo']
        content = request.form['content']

        # 사진이 아닌 다른 파일을 올리면 걸러주는 세이프 코드
        if 'image' not in file.content_type :
            return {'error':'이미지 파일을 올려주세요'}, 400

        # 사진을 먼저 S3 저장한다
        current_time = datetime.now()
        new_file_name = current_time.isoformat().replace(':','_') + '.jpg' # 파일명에는 콜론이 들어갈 수 없기에 리플레이스 해준다


        # 파일명을 유니크한 이름으로 변경한다
        # 클라이언트에서 보낸 파일명을 대체한다
        file.filename = new_file_name

        # s3에 파일을 업로드하면 된다
        # s3에 파일 업로드하는 라이브러리가 필요하다
        # boto3 라이브러리를 이용해서 업로드한다 (참고 라이브러리 설치는 pip install boto3 )
        client = boto3.client('s3', aws_access_key_id = Config.ACCESS_KEY , aws_secret_access_key = Config.SECRET_ACCESS )

        try :
            client.upload_fileobj(file, Config.S3_BUCKET, new_file_name, ExtraArgs= {'ACL':'public-read','ContentType':file.content_type} )


        except Exception as e :
            return {'error':str(e)}, 500

        # 저장된 사진의 imgUrl 을 만든다
        imgUrl = Config.S3_LOCATION + new_file_name

        # DB에 저장한다
        try :
            connection = get_connection()
            query = '''insert into posting (content, imgUrl) values (%s, %s)'''
            record = (content, imgUrl)
            cursor = connection.cursor()
            cursor.execute(query, record)
            connection.commit()
            cursor.close()
            connection.close()

        except Error as e :
            print(e)
            cursor.close()
            connection.close()
            return {'error':str(e)}, 500

        return {'result':'success'}, 200

# 먼저 폼데이터를 받아오기전에 사진과 글 모두가 있는지를 검수하는 if 문을 작성해준다

그 뒤 사진과 글을 클라이언트로부터 받아온다

받아온 파일이 사진이 아닐경우를 검수하는 if 문을 작성하고

DB에 저장을 해야하므로 사진을 url로 바꿔줘야한다

그러기 위해서는 우선 S3에 저장을 하는 코드를 작성한다

s3에 저장하기위해 파일명을 현재시간을 붙여 유니크하게 만들어주고 boto3 라이브러리를 이용해 파일을 업로드해준다

업로드 된 객체 url을 가져와서 쿼리문을 사용해 사진url과 글 모두를 DB에 저장해준다

 

 

 

# 사진과 글 모두를 정상적으로 올릴 경우 DB에 잘 저장되었다

 

 

 

 

# 사진이 아닐 경우 상태코드 400과 함께 이미지파일을 올려주세요라는 에러가 출력된다

'Python > Flask' 카테고리의 다른 글

open api 이용하는 방법  (0) 2023.01.13
Flask 기본 구조  (0) 2023.01.13
S3에 저장된 이미지 객체 탐지 API  (1) 2023.01.12
S3에 이미지 업로드하는 API  (0) 2023.01.12
리얼 타임 추천 시스템 API  (0) 2023.01.10