728x90
Django에서 웹을 만들고 FastAPI에서 딥러닝 모델을 돌리기 위해서 서버를 분리했다.
Django에서 FastAPI API를 연결해서 데이터를 주고 받았고, 이미지를 다중으로 받아야 했기 때문에 리스트 형태로 받았다.
1) FastAPI 함수 구성
@app.post('/cnn_model')
async def cnn_model(uploaded_files: List[UploadFile] = File(...)) -> JSONResponse:
# 결과와 이미지를 딕셔너리에 담아 리스트에 추가
image_with_results = []
# 업로드된 파일의 객체를 바이너리로 이미지 데이터를 읽는다.
for uploaded_file in uploaded_files:
content = await uploaded_file.read()
# 바이너리 데이터를 이미지로 디코딩를 한다.
decode_img = cv2.imdecode(np.frombuffer(content, np.uint8), cv2.IMREAD_COLOR)
# 이후에는 본인이 구현해놓은 모델에 맞게 돌린다.
"""
모델
"""
return JSONResponse(content=image_with_results)
FastAPI에서 이미지 파일은 UploadFile = File(...) 형태로 받고 Json형태로 받을 것이기 때문에 JSONResponse를 넣었다.
2) Django 함수 구성
def service(request):
if request.method == "POST":
if 'user_food' in request.FILES:
# 전송할 데이터 설정 (multipart/form-data 형태)
# html에서 form태그에 enctype="multipart/form-data" 옵션이 있어야 한다.
user_foods = request.FILES.getlist('user_food')
file_bytes_list = []
for user_food in user_foods:
file_bytes = user_food.read() # 파일 내용을 바이너리로 읽어옴
file_bytes_list.append(file_bytes) # 바이너리를 바이트 리스트에 추가함
# FastAPI 서버 URL 설정
url = 'http://127.0.0.1:10000/cnn_model'
uploaded_files = [('uploaded_files', file_bytes) for file_bytes in file_bytes_list]
response = requests.post(url, files=uploaded_files)
if response.status_code == 200:
# FastAPI에서 반환한 JSON을변수에 저장
image_with_results = response.json()
POST로 값을 주고 받고 FastAPI의 데이터 유효성 검사에 맞게 형태를 맞춰서 이미지 데이터를 전달했다.
이때 장고에서 ('uploaded_files', file_bytes)의 키 값과 FastAPI에서 async def cnn_model(uploaded_files ......)의
키 값이 일치 해야한다. 그래야 데이터를 주고 받을 수가 있다.
이후에 image_with_results 변수로 이미지 데이터를 다루면 된다.
728x90
SMALL
'Develop > FastAPI' 카테고리의 다른 글
FastAPI 프로젝트 마무리(Render, Elephantsql, 배포하기) - 97 (0) | 2023.02.02 |
---|---|
FastAPI 프로젝트 git 올리기(git 명령어) - 96 (0) | 2023.02.01 |
FastAPI 프로젝트 진행(비밀번호 변경, 라우터 추가) - 95 (0) | 2023.01.31 |
FastAPI 프로젝트 진행(코드 정리) - 94 (0) | 2023.01.29 |
FastAPI 프로젝트 진행(회원가입 기능 구현) - 93 (0) | 2023.01.29 |