swsnu / swppfall2019

31 stars 23 forks source link

[HW3] Signin Test관련 질문입니다. #172

Open NSYT0607 opened 4 years ago

NSYT0607 commented 4 years ago

늘 수고가 많으십니다. 감사합니다!

다름이 아니라 제가 지금 Testing을 하고 있는 상태인데,

Signin을 테스트하는 과정에서 이해가 잘 안되는 부분이 있어 질문을 드리고자 합니다.

(아래의 테스트 코드는 조교님께서 skeleton에 올려주신 test_csrf와 거의 동일하여 첨부해도 될 것 같아 첨부합니다.) image

지금 이 상태로 테스트를 돌려보면 마지막 줄의 assertEqual에서 status code가 401이 나오면서 fail이 됩니다.

실제로 코드 상에 찍어보니 authenticate()의 결과값으로 None이 반환되는 것을 확인한 상황입니다.

지금 코드 상에서 TestDB에 User를 생성하여 넣어주고, 이와 동일한 이름과 비밀번호를 가진 user를 찾고 있는데 실패하는 것 같습니다. (생성한 후에 바로 아래에 User.objects.all()을 통해서 확인하면 TestDB에는 정상적으로 들어있는 것으로 나옵니다.)

그런데 제가 혹시나 해서, 아예 이 signin Testing에 User.objects.create() 대신 signup을 하는 post를 날려서 user를 생성하고 시도하는 경우에는 정상작동 하는 것을 확인하였습니다.

미리 직접 objects를 생성하는 것과 signup을 통해 생성하는 것에 차이가 있는 건지 궁금합니다.

ktaebum commented 4 years ago

User.objects.create => User.objects.create_user로 바꿔서 하시면 될겁니다 🙂

NSYT0607 commented 4 years ago

User.objects.create => User.objects.create_user로 바꿔서 하시면 될겁니다 🙂

앗... 감..사합니다 ㅠㅠ User 모델은 기본적으로 create_user라는 메서드를 사용하는 건가보네요. 장고 공식 문서를 꼼꼼히 읽지 않고 질문을 드린 것 같습니다. 죄송합니다.

ktaebum commented 4 years ago

앗 아닙니다 참고로 말씀드리면 저렇게 QuerySet에 바로 create를 부르는 경우에는 그냥 User에 password 값을 그대로 저장을 하게 되구요

create_user를 부르면

def _create_user(self, username, email, password, **extra_fields):
        """
        Create and save a user with the given username, email, and password.
        """
        if not username:
            raise ValueError('The given username must be set')
        email = self.normalize_email(email)
        username = self.model.normalize_username(username)
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

여기서 set_password라는 것을 호출을 하게 됩니다. 이 때

def set_password(self, raw_password):
        self.password = make_password(raw_password)
        self._password = raw_password

들어온 raw_password를 hashing해서 저장 (make_password)하기 때문에

그 과정이 빠지면 authentication에서 password가 틀렸다고 말하게 됩니다.

NSYT0607 commented 4 years ago

자세한 설명 감사합니다!