클라이언트가 이미지와 텍스트를 보내면 받아서 내 DB에 저장하는 포스팅 API를 만들어보자.
DB에 이미지를 저장할 때는 이미지 URL로 저장하기 때문에,
먼저 받은 이미지를 자동으로 내 AWS S3에 업로드 해야 한다.
S3에 파일 업로드 참고: https://donghyeok90.tistory.com/201
1. DB에 저장할 테이블을 만든다.
2. 개발한 포스팅 API 코드
from flask import request
from flask_restful import Resource
from datetime import datetime
import boto3
from mysql.connector import Error
from config import Config
from mysql_connection import get_connection
class PostingResource(Resource):
def post(self):
# 1. 클라이언트로부터 데이터를 받아온다.
# form-data
# -photo : file
# -content : text
# 사진과 내용은 필수항목이다!!
if 'photo' not in request.files or 'content' not in request.form:
return {'error' : '데이터를 정확히 보내세요'}, 400
file = request.files['photo']
content = request.form['content']
print(file.content_type)
# 업로드한 파일이 이미지가 아닌 경우 처리
if 'image' not in file.content_type:
return {'error' : '이미지파일만 업로드하세요.'}
# 2. 사진을 먼저 S3에 저장한다.
# 파일명을 유니크하게 만드는 방법
current_time = datetime.now()
new_file_name = current_time.isoformat().replace(':', '_') + '.' + file.content_type.split('/')[1]
print(new_file_name)
# 파일명을, 유니크한 이름으로 변경한다.
# 클라이언트에서 보낸 파일명을 대체
file.filename = new_file_name
# S3에 파일을 업로드
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
# 3. 저장된 사진의 이미지URL을 만든다.
imgUrl = Config.S3_LOCATION + new_file_name
# 4. 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'}
config.py 파일
- 민감한 정보를 관리
class Config :
HOST = AWS RDS주소
DATABASE = DB명
DB_USER = 유저명
DB_PASSWORD = 비밀번호
# AWS 관련 키
ACCESS_KEY = IAM 사용자 access key
SECRET_ACCESS = IAM 사용자 secret access key
# S3 버킷
S3_BUCKET = 버킷명
# S3 Location
S3_LOCATION = 'https://버킷명.지역명.amazonaws.com/'
위에 사용한 get_connection 함수는 다음과 같다.
def get_connection():
connection = mysql.connector.connect(
host= Config.HOST, # AWS RDS 주소
database= Config.DATABASE, # DB명
user= Config.DB_USER, # 유저명
password= Config.DB_PASSWORD # 비밀번호
)
return connection
3. 테스트
포스트맨에서 테스트
성공했다고 나온다.
DB에 가서 확인해보자.
select * from posting;
DB에 성공적으로 저장되었고 이미지 주소도 정상적인걸 확인.
'REST API' 카테고리의 다른 글
Python HTTP 라이브러리 - Requests 사용법 (0) | 2023.01.13 |
---|---|
네이버 오픈API 활용 - 뉴스 검색 API (0) | 2023.01.13 |
API서버 - AWS Rekognition을 사용한 Object Detection API (0) | 2023.01.13 |
API서버 - @jwt_required(optional=True)를 이용한 분기 처리 (0) | 2023.01.10 |
API서버 - Flask 쿼리스트링(Query String)을 사용한 API (0) | 2023.01.06 |