장고 Integrity Error, NOT NULL constraint failed

미음제

·

2020. 11. 18. 21:43

 

깃허브 로그인 연동을 구현하던 중에

에러가 발생했다.

 

NOT NULL constraint failed: users_user.username

 

 

 

오류 내용은 

user를 username 없이

생성하려고 해서 문제가 생기는 것이다.

 

오류가 발생한 부분은

profile_request = requests.get(
                    "https://api.github.com/user",
                    headers={
                        "Authorization": f"token {access_token}",
                        "Accept": "application/json",
                    },
                )
profile_json = profile_request.json()
username = profile_json.get("login", None)
if username is not None:
	name = profile_json.get("name")
	email = profile_json.get("email")
	bio = profile_json.get("bio")

이 부분이다.

 

NOT NULL constraint failed

오류는 간단히 해결할 수 있다.

 

models.py에서 오류가 발생한

해당 class에서

오류가 발생한 필드 값에

null = True를 추가하면 오류를 해결할 수 있다.

 

 

그러나,

깃허브 로그인 연동을 구현하며 

오류를 해결하지 못한 이유는

username은 내가 선언한 변수가 아니었다.

 

 

username은

로그인 연동과정에서

사용자가 로그인을 시도하면

깃허브 주소로 redirect 시켜

깃허브 정보를 토대로

다시 내 서버로 redirect 시키며 

반환시키는 값인 것이다.

 

 

 

문제를 해결하기 위해

깃허브 아이디를 다시 보니

아이디에 이름과 bio가 적혀있지 않은 상태면

None으로 나와 문제가 발생한 것이다.

 

if name is None:
name = username

if bio is None:
bio = ""

 

이처럼 코드를 수정해주면

깃허브에서 보내는 사용자 정보에서

이름과, bio가 없어도

계정을 생성할 수 있도록 해준다

위에 설명한

null = True와

 

 

코드를 수정하고 다시 실행해본 결과

또다시 오류가 발생했다.

 

 

name과 bio처럼 null = True를 

해주어도 되지만

email 정보를 추후에 username으로 사용할 것이라

email이 None이면 안된다.

 

 

 

 

그래서 다시 깃허브로 돌아가

프로필에서 Settings로 들어가 준다.

 

그리고

 

emails로 들어가 보면,

keep my email addresses private가

체크가 되어있다면

email을 공개하지 않아

email 값을 반환하지 못한 것이다.

이 부분을 체크를 해제해주고,

 

다시 프로필 메인 화면으로 돌아와

Public email에 공개할 email을

선택해주면 된다.

 

깃허브 계정의 email 정보를 수정한 것처럼

username으로 반환되는 이름과

Bio를 설정해주면

코드를 수정하지 않고 해결할 수 있다.

 

반응형