본문 바로가기

Python

(13)
TypeError: Object of type JsonResponse is not JSON serializable 장고를 사용하여 스타일쉐어 클론 프로젝트를 할 때 리팩토링을 하면서 냈던 에러다. 에러 메세지가 내가 예상하는 순서대로 나지 않는다는 걸 상기했다. 그리고 디버깅시 값 뿐만 아니라 타입도 찍어봐야 겠다는 생각을 하게 되었다. 응답에 정보를 담아 프론트로 보낼 때 JsonResponse로 보내는데, exception 처리 코드를 이리저리 붙여보고 가독성을 위해 리팩토링을 하다 이전에 테스트를 할 때는 나지 않았던 에러가 발생했다. JsonResponse 안에 들어있는 키-값 쌍 하나하나를 주석처리를 해보며 문제가 있는 라인을 찾았다. get_current_user_id는 사용자가 로그인을 한 상태라면 users 테이블 상의 id를, 아니라면 0을 반환하는 함수다. 에러가 났을 당시에는 바로 찾지 못했지만,..
Python - bcrypt, pyjwt BE 개발자가 인증 인가를 구현하기 위한 필수 요건 1. 비밀번호 암호화 2. 새로 입력한 비밀번호가 기록된 것과 일치하는지 확인(인증) 3. 인가의 수단인 JWT 생성 4. JWT 유효성 확인 1. 비밀번호 암호화 bcrypt: 단방향 hash 함수로 암호화할 때 사용할 수 있는 파이썬 라이브러리. 입력, 출력값이 전부 bytes type이다. 결과값(digest)의 형태는 $$$. gensalt method로 랜덤한 salt를 만들 수 있다. gensalt()에 주는 숫자 param은 log_rounds인데, key stretching + salting을 반복하는 강도를 뜻한다. 기본 12로 되어 있고 대개 이대로 사용하는 걸 추천한다. django의 charfield에 bytes type을 넣으면 ..
Python - pyjwt v2.0.0 업데이트에 따른 이슈 인가 : 사용자가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차 사용자는 인가의 수단으로 headers에 메타데이터를 넣어서 요청을 보냅니다. pyjwt는 이 메타데이터 JWT(JSON Web Token)를 구현할 수 있게 해주는 라이브러리입니다. 2018년 말 release된 v1.7.1에서는 jwt.encode를 실행했을 때 actual result가 bytes type으로 나오는 이슈가 있었습니다. 2020년 말 release 된 v2.0.0에서는 여러가지가 바뀌었습니다. - 3.5 이하의 python은 support 하지 않음 - jwt.encode의 return type은 string - jwt.decode에 algorithms를 필수 param으로 사용 - jw..
Python - Import 모듈 불러오기 import 이렇게 import한 다음 사용할 때는 . 모듈 이름을 안 붙여주면 파이썬은 호출한 걸 지금 파일에서만 찾으려고 한다. 모듈에서 사용하는 것이 명확할 때 from import , 아래와 같이 쓰면 모듈에 있는 모든 요소를 import한다. 현재 파일에서 다른 것과 이름 충돌이 나면 알기 어려우니 비권장. from import * from .. import .. as 새 이름 여러 모듈을 import하다 불러낸 것들끼리 이름 충돌이 나거나 또는 사용하려고 불러낸 모듈/함수/변수/클래스의 이름이 너무 길면 새로 이름을 줄 수 있다. from my_module import my_func as f1 이러면 이제 my_module의 my_func은 f1으로 호출된다. 패키지를 impor..
Python - list vs tuple, set vs dictionary list와 tuple의 차이 list tuple 괄호 [ ] ( ) 수정, 순서 변경, 삭제 가능 불가능 괄호 생략 불가능 가능 요소가 한 개일 때 무관 반드시 요소 뒤에 쉼표 필요 같은 조건 하 메모리 차지 상대적으로 많이 차지함 상대적으로 적게 차지함 둘다 순서가 있는 자료형이다. 따라서 index를 사용한 호출, slicing이 가능하다. set과 dictionary의 차이 set dictionary 빈 자료형 선언하는 방법 set()만 가능 dict()와 { } 가능 수정 불가능 가능 요소의 형태 value key : value 중복 데이터를 넣었을 때 기존 값을 유지한다 새로운 값으로 교체한다 둘다 순서가 없고 index를 사용할 수 없다. 중복을 허용하지 않는 collection 자료형이다. ..
Python - Dictionary 딕셔너리는 { } 로 감싸고, 순서가 없으며 key : value 쌍으로 이루어진 요소끼리는 쉼표로 구분한다. hashable, immutable한 것만 key가 될 수 있다. value는 어떤 자료형이든 다 가능하다. dict1 = {key1 : val1, key2 : val2, key3 : val3, ... } key, value 값이 나란히 들어있는 리스트나 튜플이 요소로 들어있는 리스트나 튜플은 dict로 변형 가능하다. [ [ key1 , val1 ] ], [ ( key1 , val1 ) ], ( [ key1 , val1 ] ), ( ( key1 , val1 ) ) 형태가 할당되어 있는 변수에 dict()를 띄우면 -> { key1 : val1 } 이렇게 변환된다. 빈 딕셔너리 만들기 새로 선언..
Python - Set 집합은 { } 로 감싸고, 요소끼리는 쉼표로 구분한다. 선언은 set()또는 값을 넣은 { }으로 해야되고, { } 만으로는 할 수 없다. 순서가 없으며 중복 데이터와 mutable한 건 요소로 넣을 수 없다. s1 = {element1, element2, element3, ... } 순서가 없으니 인덱스 기호를 사용할 수 없다. 중복된 데이터를 가질 수 없으니 +, *를 사용할 수 없다. 중복을 허용하지 않는 특성을 이용해 다른 자료형의 중복을 제거하기 위해 사용하기도 한다. iterable한 객체를 넣으면 변환하여 집합을 만든다. s1 = set(문자열) 이 경우엔 문자열을 알파벳 단위로 쪼개 넣는다. &, |, -, ^ 연산자는 =와 조합해서 연산과 동시에 할당할 수 있다(파이썬 기초 연산의 += ..
Python - Tuple 튜플은 ( ) 로 감싸고, 요소끼리는 쉼표로 구분한다. 어떤 자료형이든 다 요소로 넣을 수 있다. tup = (element1, element2, element3 ... ) 한번 선언되면 수정, 순서 변경 및 삭제가 불가능하다. 괄호를 생략해도 된다. tup = 1, 2, 3 단 한 개의 요소만 가질 때는 요소 뒤에 쉼표를 반드시 붙여야 된다. tup = (1, ) 단 한 개의 요소만 가지는데 쉼표를 안 붙이면 tuple이 되지 않는다. tup =(1)의 type은 int. 수정이 필요 없고 적은 수의 간단한 형태의 데이터를 표현할 때는 tuple을 사용하는 게 더 효과적이다. 특정 데이터를 임시/즉석으로(ad hoc) 표현하고 싶을 때 사용한다. 리스트의 요소로 튜플을 사용하는 방법이 유용한데, 같은 ..
Python - List 리스트는 [ ] 로 감싸고, 요소끼리는 쉼표로 구분한다. 어떤 자료형이든 다 요소로 넣을 수 있다. lst = [element1, element2, element3, ... ] 빈 리스트 만들기 새로 선언 lst = [] 또는 lst = list() 기존 리스트 비우기 lst.clear() 수정 lst[index] = new_val 없으면 알아서 추가해주는 dict와 달리 반드시 기존에 존재하는 index를 넣어야 된다. 있는 값 확인 값이 있는지 확인 val in lst 값이 없는지 확인 val not in lst 특정 값의 index 반환 lst.index(val) 그 값이 여러개 있다면 첫번째 index를 반환함. 없는 경우 ValueError 리스트 길이 구하기 len(lst) 특정 element..
Python - Function Parameters Parameters vs Arguments 함수 선언부에 있는 이름은 parameter, 함수를 호출하며 넣어서 함수에 전달된 값은 argument이다. 참고 링크 함수를 호출할 때는 함수 선언시 정해둔 규정에 따라 argument를 전달해야 된다. 어떤 값은 위치에 맞추어, 어떤 값은 keyword를 주며 넣어야 되는데 이는 함수 정의부의 Parameter 순서를 보고 구분할 수 있다. 기본적으로는 위치 인자 - 가변 인자(*args) - 키워드 가변 인자(*kwargs) 순이다. 여기에 default까지 추가하면, 위치 인자 - default 인자 - 가변 인자(*args) - 키워드(w/, w/o default 순서 상관 없음) - 키워드 가변 인자(**kwargs) 이게 최종! 이를 익힌 예제는 ..