ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2022_09_23
    TIL WIL 2022. 9. 23. 03:20

    "눈질을 하며 주먹질을 하며 이런 글자들이 지나간다
    - 하늘이 이 세상을 내일 적에 그가 가장 귀해하고 사랑하는 것들은 모두
    가난하고 외롭고 높고 쓸쓸하니 그리고 언제나 넘치는 사랑과 슬픔 속에 살도록 만드신 것이다
    초생달과 바구지꽃과 짝새와 당나귀가 그러하듯이
    그리고 또 '프랑시쓰 쨈'과 도연명과 '라이넬 마리아 릴케'가 그러하듯이" 

     

    서강대 신문방송학과 중퇴, 카투사 만기전역, 한국예술종합학교 영상원 수석졸업, 몇 차례의 영화제 초청, 한 독립영화제의 폐막작 선정, NGO 국제부 근무, 서울시 교육청 예술강사, 그리고 긴 장마의 시간. 만 32살, 개발공부 시작.

     

    벌레먹은 깻잎 같은 내 이력서. 그 텍스트파일 하나에 적힐 이 말들이 아주 가벼워지길. 새털 같이 타닥타닥 모닥불에 섞일 수 있기를.  

     

    "새끼오리도 헌신짝도 소똥도 갓신창도 개니빠디도 너울쪽도 짚검불도 가락잎도 머리카락도 헌겊조각도 막대꼬치도 기와장도 닭의짗도 개터럭도 타는 모닥불 재당도 초시도 門長늙은이도 더부살이 아이도 새사위도 갓사둔도 나그네도 주인도 할아버지도 손자도 붓장사도 땜쟁이도 큰개도 강아지도 모두 모닥불을 쪼인다 
    모닥불은 어려서 우리 할아버지가 어미아비 없는 서러운 아이로 불상하니도 뭉둥발이가 된 슬픈 역사가 있다 " 

     


    jwt.encode 에러 메시지 :

    TypeError: Object of type bytes is not JSON serializable

    jwt.encode(payload, KEY, algorithm="HS256").decode('utf-8')

     

    1. 로컬 환경에서, decode('utf-8')을 붙이면 다음의 에러 메시지가 뜬다.

    AttributeError: 'str' object has no attribute 'decode'

     

    이에 대한 강의록의 답변은 아래와 같다. 

    더보기

     

    python interpreter 화면에서 PyJWT 라이브러리 이름 클릭 > 하단 마이너스 (-) 버튼 클릭해서 라이브러리를 제거해주세요!

     

    ...

     

    기존 버전에서는 jwt.encode()함수의 리턴값이 '바이트 문자열'이라는 자료형이었기 때문에 뒤에 .decode('utf-8')를 붙여 일반 문자열로 바꾸어주었었는데요, 2.0.0 버전부터는 이 함수의 리턴값이 일반 문자열이기 때문에 여기에 또 .decode('utf-8')를 붙여주게 되면 문자열에는 이런 메소드가 없으므로 에러가 나게 됩니다. (101100100110 같은 바이트 자료를 문자열로 바꾸는 것이 decode이므로 당연히 문자열에는 이런 기능이 필요없겠죠? ㅎㅎ)

    그리고, 이렇게 하기 싫었다. 다운그레이드를 해서 우회하라니.

     

    연대기적 시간순에서, 뒷부분에 놓일 수록 슬픈 것들이 있다.

    아버지와 어머니의 주름이라거나. Mac OS의 새로운 업데이트라거나. 

    하지만 이건 업데이트를 한다고 해서 슬퍼질 것이 없다.

     

    하여튼 해결책은 간단한데, decode('utf-8')을 제거하면 된다.

    jwt.encode(payload, KEY, algorithm="HS256")

    굳이 utf-8로 변환할 필요가 없다는 것.

    문제는 그 다음이다.

     


    2. 배포 환경에서, decode('utf-8')을 빼면  다음의 에러 메시지가 뜬다.

    TypeError: Object of type bytes is not JSON serializable

     

    정확한 에러 메시지는 아래와 같다.

    더보기

     File "/home/ubuntu/.local/lib/python3.8/site-packages/flask/json/provider.py", line 122, in _default

        raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable")

    TypeError: Object of type bytes is not JSON serializable

    ubuntu ec2의 provider.py는 TypeError 메시지 출력을 정의하고 있는 파일일 뿐이다.

    원인은 일반문자열로 인코딩된 토큰이다.

     

    주변의 감사한 가르침에 의하면, 기본적으로 HTTP 혹은 브라우저 측에서는 UTF-8 유니코드를 값으로 가져온다.

    해결책은 또다시 간단한데, decode('utf-8')을 다시 붙이는 것이다...

    jwt.encode(payload, KEY, algorithm="HS256").decode('utf-8')

     


    3. json.dumps  : 사실 가장 세련된 해결책  

    https://stackoverflow.com/questions/50104782/jwt-encode-fails-with-object-of-type-bytes-is-not-json-serializable

     

    jwt.encode fails with "Object of type 'bytes' is not JSON serializable"

    I am trying to return a token to my user after they have been successfully logged in but keep getting the following error: TypeError: Object of type 'bytes' is not JSON serializable How can I fix...

    stackoverflow.com

     

    주변의 감읍할 가르침에 따르면, json.dumps 모듈에 utf-8 로의 전환이 내장되어 있는듯 하다.

    JSON과 Python 사이의 자료 교환 방식에 대해서는 더 공부가 필요하다.

     

     

Designed by Tistory.