[DRF] CLOVA-OCR 적용(2)

yuKeon·2023년 1월 19일
0

DRF

목록 보기
5/7
post-thumbnail

2023-01-11

800 line이 넘는 JSON 코드를 프론트로 보내줄 수 없다…특정 데이터(memo, date, cost)만 뽑아내자

1번 문제의 경우 해결을 위해 공식 문서를 찾아봤지만 못 찾았다.

결국 NAVER CLOUD PLATFORM 고객센터에 전화해서 답변을 받았다.

OCR API는 네이버에서 제공하기 때문에 사용자가 response를 수정 하지 못 하지만, Json Parsing을 찾아보시길 추천드립니다.”


Json Parsing으로 코드 중 일부만 프론트로 넘겨주는 방법을 찾았다.
ocr/views.py에 아래 코드를 추가했다. 효율적인 방법은 아니지만 효과는 확실했다..!

	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 = images_receipt['result']['totalPrice']['price']['text']

  • 전체 코드
    ```python
    @api_view(['POST'])
    def ocr_receipt(request):
        api_url = OCR_API_URL
        secret_key = OCR_SECRET_KEY
        image_file = request.data['url']
    
        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'))
        ]
        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 = images_receipt['result']['totalPrice']['price']['text']
    
        return JsonResponse({"memo": receipt_memo
                                , "date": receipt_date
                                , "cost": receipt_price},
                            safe=False, status=status.HTTP_200_OK)
    ```

postman에서 테스트 해보니 원하는 값만 나왔다.

0개의 댓글