我在 Django 休息框架中为我的登录视图编写了一个测试。这是测试:
class LoginViewTests(APITestCase):
def setUp(self):
self.user = User.objects.create_user(
phone_number='09012345678',
password='Test_1_Password'
)
def test_login(self):
url = reverse('login')
data = {
'phone_number': '09012345678',
'password': 'Test_1_Password'
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_login_user_does_not_exist(self):
url = reverse('login')
data = {'phone_number': '09123456789', 'password': 'Test_1_Password'}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
这是相关观点:
class LoginView(generics.GenericAPIView):
serializer_class = LoginSerializer
def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
return Response(serializer.data, status=status.HTTP_200_OK)
和序列化器:
class LoginSerializer(serializers.Serializer):
phone_number = serializers.CharField(max_length=13, required=True)
password = serializers.CharField(max_length=50, required=True, write_only=True)
tokens = serializers.SerializerMethodField(read_only=True)
def get_tokens(self, obj):
user = User.objects.get(phone_number=obj['phone_number'])
return {
'refresh': user.tokens()['refresh'],
'access': user.tokens()['access']
}
class Meta:
model = User
fields = ['phone_number', 'password', 'tokens']
def validate(self, attrs):
phone_number = attrs.get('phone_number', '')
password = attrs.get('password', '')
user = auth.authenticate(phone_number=phone_number, password=password)
if not user:
raise AuthenticationFailed('Invalid credentials')
if not user.is_active:
raise AuthenticationFailed('Account disabled, contact admin')
if not user.is_verified:
raise AuthenticationFailed('phone number is not verified')
return {
'phone_number': user.phone_number,
'tokens': user.tokens
}
当我通过 postman 或 swagger 测试它时,登录成功,但是当我运行测试时,我得到错误 401 unauthorized。 你可以看到,我没有使用 IsAuthenticated 权限
我检查视图中的所有内容,序列化程序可能会出现问题,但一切看起来都很好,我还设置了权限 AllowAny 以查看,但结果相同。