【发布时间】:2021-04-15 09:57:03
【问题描述】:
我有一个测试用例,它首先创建一个用户,然后尝试使用 Django authenticate() 方法对创建的用户进行身份验证,但看起来密码没有得到散列,因此无法检索令牌...我将分享与本节相关的任何代码,我认为这些代码必须对流程进行处理。
自定义用户模型管理器:
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
""" Creates and saves a new user """
if not email:
raise ValueError("Users must have an email address.")
user = self.model(
email=self.normalize_email(email),
**extra_fields
)
# Set password this way makes a hashed password
user.set_password(password)
user.save(using=self._db)
return user
app/settings.py:
AUTH_USER_MODEL = "core.User" # 'User' is the name of custom user class
用户/serializers.py:
class UserSerializer(serializers.ModelSerializer):
""" Serializer for the users object """
class Meta:
model = get_user_model()
fields = ["email", "password", "name"]
extra_kwargs = {
"password": {
"write_only": True,
"min_length": 5,
}
}
def create(self, validated_data):
""" Create a new user with encrypted password and return it """
user = get_user_model().objects.create(
email=validated_data["email"],
name=validated_data["name"]
)
user.set_password(validated_data["password"])
print(f"from serializer: {user.password}")
user.save()
return user
最后是我的测试用例 user/tests/test_user.py:
#...
def test_create_token_for_user(self):
""" Test that a token is created for the user """
payload = {
"email": "test@test.com",
"password": "testpass"
}
user = get_user_model().objects.create(**payload)
print(user.password) # returns 'testpass' in plain text...
res = self.client.post(TOKEN_URL, payload)
self.assertIn("token", res.data)
self.assertEqual(res.status_code, status.HTTP_200_OK)
【问题讨论】:
标签: python django django-models django-rest-framework tdd