티스토리 뷰
content에 유니코드가 있는 상태로 response를 그냥 만들어서 return 해버리면 unicode escape sequence(\u로 시작되는 문자열)이 출력되버린다. response를 받는 곳에서 알아서 encoding, decoding을 잘 하면 문제가 없지만 나 같은 경우에는 API 서버에서 return 값이 이런게 나온다는게 굉장히 맘에 안 들어서 해결하고 싶었다. 일단 브라우저에서 테스트하는 경우가 많은데 브라우저에서 볼 때 정상적인 한글 문자열을 볼 수가 없으니 좋지 않다고 판단했기 때문이다.
나 같은 경우에는 json 데이터를 출력해주기 위해 원래 Flask의 jsonfiy 함수를 이용하여 response를 만들어 return 시켰었는데, 이것이 문제였다. 내부적으로 유니코드들을 제 멋대로 처리를 해버린 것. 이를 해결하기 위해 꽤 장시간 검색을 했는데 온갖 해결방법들이 제시되었지만 답이 아니었다.
그러다가 이 글을 발견하고 이슈를 종결지을 수 있었다. json.dump 함수를 이용하면서 ensure_ascii 옵션을 조절하는 것은 이미 시도해본 방법이었지만, 그 결과값을 utf-8로 다시 encode 한 결과 값을 return 하는 것은 안 해봤어서.... 이걸로 하니까 잘 됬다.
근데 모든 곳에서 이런 짓을 하는 코드를 써주는건 중복성이 너무 심하니까 데코레이터를 활용하기로 했다.
import json
from flask import Response
from functools import wraps
def as_json(f):
@wraps(f)
def decorated_function(*args, **kwargs):
res = f(*args, **kwargs)
res = json.dumps(res, ensure_ascii=False).encode('utf8')
return Response(res, content_type='application/json; charset=utf-8')
return decorated_function
@app.route('/')
@as_json
def index(self):
return {
'data': u'터프 프로그래머'
}
Response를 만들어서 return 해주는 데코레이터를 써서 원래 함수의 return 값(보통은 dictionary)을 json.dumps 한 문자열을 Response로 돌려주게 해준다.
Response를 만들 때는 Content-Type 헤더를 지정해줘서 브라우저에서도 렌더링이 잘 될 수 있게 해주고....
몇 시간 동안의 삽질이 이렇게 간단하게 해결되서 씁쓸하다 ㅠ
'프로그래밍 > 잡탕' 카테고리의 다른 글
[JS] br to nl, nl to br (0) | 2016.03.16 |
---|---|
[Web] 오늘의 삽질 - require.js 관련 (0) | 2016.03.09 |
StreamReader ReadLine으로 메세지 읽을 때 문제점 (0) | 2015.06.13 |
Eclipse에서 Jess 쓰기 (0) | 2015.05.14 |
[Octave] Gradient Descent Multi feature (0) | 2015.04.18 |
- Total
- Today
- Yesterday