개발로 자기계발
article thumbnail
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
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)