Django 2.0 UnicodeDecodeError 해결법

최근 이메일 인증을 다시 구현하기 위해 전에 쓰던 코드를 적용하고 테스트를 하는데…

에러

아니 이게 왠 처음보는 에러메시지인가..

정신 차리고 언제나 해답이 있는 장고 공식문서를 찾아가보았다. 아니나 다를까 그 곳엔 역시 해답이 있었다.

바이트스트링

Django는 1.11 버전까지 Python 2를 지원하기 위해 bytestring과 unicode string을 모두 지원했었지만 Django가 2.0으로 버전 업이 되면서 Python 2는 더 이상 지원하지 않게 되면서 bytestring 사용을 제한한다는 얘기이다.

그리고 친절하게 reverse() 전에 force_text() 대신 먼저 decode()를 호출하라는 우리의 공식문서.

# 회원가입 api 쪽 encode 부분
...

html_message = render_to_string('user_activate.html', {
    'domain': current_site.domain,
    'uid': urlsafe_base64_encode(force_bytes(user.pk)),
    'token': urlsafe_base64_encode(force_bytes(user.token)),
})

...
# 이메일 인증 메서드 decode 부분
def activate(request, uidb64=None, token=None):
    uid = force_text(urlsafe_base64_decode(uidb64))
    token = force_text(urlsafe_base64_decode(token))

    ...

이러했던 코드를…

# 회원가입 api 쪽 encode 부분
...

html_message = render_to_string('user_activate.html', {
    'domain': current_site.domain,
    'uid': urlsafe_base64_encode(force_bytes(user.pk)).decode(),
    'token': urlsafe_base64_encode(force_bytes(user.token)).decode(),
})

...
# 이메일 인증 메서드 decode 부분
def activate(request, uidb64=None, token=None):
    uid = urlsafe_base64_decode(uidb64).decode()
    token = urlsafe_base64_decode(token).decode()

    ...

이렇게 바꾸어주니!

편ㅡ안