티스토리 뷰

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 헤더를 지정해줘서 브라우저에서도 렌더링이 잘 될 수 있게 해주고....

몇 시간 동안의 삽질이 이렇게 간단하게 해결되서 씁쓸하다 ㅠ


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday