[DRF] CLOVA OCR API 적용(4)

yuKeon·2023년 1월 19일
0

DRF

목록 보기
7/7
post-thumbnail

2023-01-15

S3에 영수증 사진을 저장하고 사진 링크로 OCR API를 호출하려고 했는데 에러가 떴다.

공식 문서를 찾아봤지만 정보가 없었고, 다시 NAVER CLOUD PLATFORM 고객센터에 전화해 답변을 받았다.

“OCR API는 보안 문제로 외부 URL 링크로 OCR API를 호출하는 것이 불가능하고, 컴퓨터에 저장된 사진만 가능합니다.”


즉, 내 컴퓨터에 저장된 영수증 사진의 경로만 가능하다.

해결을 위해 아래의 과정으로 API 호출 함수를 수정했다.

  1. 프론트에서 사진 파일을 백엔드로 전달
  2. 백엔드는 프로젝트 폴더 내부에 사진을 저장
  3. 저장된 사진의 경로로 OCR API 호출
  4. OCR API를 호출하면 사진을 삭제

  • 전체 코드
    @api_view(['POST'])
    def ocr_receipt(request):
        api_url = OCR_API_URL
        secret_key = OCR_SECRET_KEY
        file_name = save_image(request.FILES['files'])
        image_file = fs.url(file_name)
    
        request_json = {
            'images': [
                {
                    'format': 'jpg',
                    'name': 'demo'
                }
            ],
            'requestId': str(uuid.uuid4()),
            'version': 'V2',
            'timestamp': int(round(time.time() * 1000))
        }
    
        payload = {'message': json.dumps(request_json).encode('UTF-8')}
        files = [
            ('file', open(image_file, 'rb'))
        ]
    
        fs.delete(file_name) //API를 호출하고 나면 사진을 삭제
    
        headers = {
            'X-OCR-SECRET': secret_key
        }
    
        response = requests.request("POST", api_url, headers=headers, data=payload, files=files)
    
        response_body = json.loads(response.text)
    
        images = response_body['images']
        images_receipt = images[0].get("receipt")
    
        receipt_memo = images_receipt['result']['storeInfo']['name']['text']
        receipt_date = images_receipt['result']['paymentInfo']['date']['text']
        receipt_price = int(
            float(re.sub(r"[^\uAC00-\uD7A30-9a-zA-Z\s]", "", images_receipt['result']['totalPrice']['price']['text'])))
    
        return JsonResponse({"memo": receipt_memo
                                , "date": receipt_date
                                , "cost": receipt_price},
                            safe=False, status=status.HTTP_200_OK)
    
    def save_image(files): //사진 저장 함수
        img_file = files
        filename = fs.save(img_file.name, img_file)
        return filename
    

참고

Django 파일 업로드(File Upload)

0개의 댓글