[Python] Flask Response Encoding 문제

2021. 4. 28. 01:56 Python/Python 프로그래밍

파이썬에서 response를 보내는데, utf8이아닌, 유니코드 그대로 보내지고, 화면에 출력되는 문제가 발생했다. 정말 파이썬 하면서 encoding 문제는 진짜… 항상 마주할때마다 이렇게 해서 고쳐야지~라고 생각하고 고쳤을때 바로 안되면, 그냥 당황스럽기 짝이없음.

 

{

  "code": 100, 

  "data": {

    "\uc548\ub155": 2, 

    "\ud558\uc774\ub8e8": 2

  }, 

  "mesg": "success", 

  "method": "get", 

  "target": "/api/test", 

  "time": 0.001

}

 

 

아무래 utf8로 encoding을 해도 결과는 같음, postman에서 json으로 보면 아주 예쁘게 보여서  content-type을 appliction/json으로 보내면 되나 했더니 그것도 안되니, 이제 여기서부터 당황 스러움이 시작되었다.

 

아무튼 결론적으로 엄청나게 삽질을하고 삽질을 했다. 

문제는 내가 response를 할때 dict의 형태로 생성해서 보내는게 가장 문제

flask에서 지원하는 make_response를 사용하면 문제는 쉽게 해결을 할 수 있다.

함수 내부에서 header에 text/html; charset=utf-8를 설정해주기 때문에 문제 없이 utf8로 응답이 보내진다. 

 

이전에는 header없이 body만 전달했기 때문에 unicode그대로 화면에 출력을 했다.

flask의 make_response를 사용하기 위해서는 아래와 같이 사용한다.

 

from flask import make_response

# resp (Response Object)
resp = make_response(json.dumps(body, ensure_ascii=False).decode(‘utf8’))
# 여기서 resp는 response class의 객체로 body의 데이터를 가지고 오기 위해서는 resp.get_data(), 데이터를 셋하기 위해서는 resp.set_data()를 하면된다. 
# return 되는 type은 str이기 때문에 json.loads를 통해서 dict의 형태로 변경을 시켜야한다. 
# 보통 body에 데이터를 추가하고 싶으면 아래와 같이 추가하면 된다. 

d = json.loads(resp.get_data())
d['time'] = float('%.4f' % (time.time() - tic))
resp.set_data(json.dumps(d, ensure_ascii=False).decode('utf8'))

 

{"code": 100, "target": "/api/test", "mesg": "success", "time": 0.0018, "data": {"안녕": 2}, "method": "get"}

 

 

[참고] 

http://flask.pocoo.org/docs/0.12/api/#flask.Flask.response_class

http://flask.pocoo.org/docs/0.12/api/#flask.Response

 

출처 : ourcstory.tistory.com/234?category=630693