[Python] Flask Response Encoding 문제
파이썬에서 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
'Python > Python 프로그래밍' 카테고리의 다른 글
파이썬 HTML 파싱 하는 방법 (0) | 2021.04.28 |
---|---|
파이썬 스케일이 다른 그래프 (0) | 2021.04.28 |
파이썬 디렉토리 생성 코드 (0) | 2021.04.28 |
파이썬 데이터 읽기 (pandas) (0) | 2021.04.28 |
[Python] Flask logging 하는 방법 (0) | 2021.04.28 |
[Python] Virtualenv 설치 및 dependencies 관리하기 (0) | 2021.04.28 |
[Python] matpltlib import 에서 발생한 에러 (0) | 2021.04.28 |
[Python] stdin, stdout, pipeline 이용해 데이터 처리하는 방법 (0) | 2021.04.28 |