Django REST Framework client.login() 不工作。 (用户创建)
Django REST Framework client.login() not working. (User created)
我正在使用 Django REST Framework 构建简单的 API,使用 curl 和 API 网络管理员一切正常,但是如果我 运行 以下测试:
class OrderTest(APITestCase):
username = 'admin'
password = '12345'
def setUp(self):
User.objects.create(
username=self.username,
password=self.password,
email='demo@demo.com',
is_superuser=True,
is_staff=True
)
def test_create_order_by_admin(self):
url = '/api/orders/'
data = {
'name': 'John Doe',
'phone': '380000000000',
'status': 1,
'email': 'jonhn.doe@gmail.com',
'date': datetime.now(),
}
# Cheking if user exist
self.assertEqual(User.objects.get(pk=1).username, self.username)
self.client.login(
username=self.username,
password=self.password,
)
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Order.objects.count(), 1)
for key, value in data.items():
self.assertEqual(Order.objects.get().key, value)
失败并出现以下错误:
Failure
Traceback (most recent call last):
File "/home/linevich/projects/swebion.com/project/order_form/tests.py", line 71, in test_create_order_by_admin
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
AssertionError: 403 != 201
这意味着 client.login()
不工作。
有什么想法吗?
您不应该直接设置密码。这将以明文形式存储密码,而 Django 将在尝试登录时尝试哈希算法。
请参阅 set_password 以加密存储。
使用authenticate函数代替client.login
这里我使用基于通用 class 的视图来登录用户..
class 登录(generics.CreateAPIView):
'''
API 用于登录到 return 用户模型以及访问令牌。
'''
def post(self, request, *args, **kwargs):
username = self.request.data.get('email', None)
password = self.request.data.get('password', None)
user = authenticate(username=username, password=password)
response = {}
if user:
access = AppCustomMethods()
access_token = access.create_access_token(user, request,
settings.XAMARIN_APPLICATION_NAME)
response_data = {}
response_data['access_token'] = access_token
signup_serializer = serializers.GetUserWithAllBusinesses(user)
response_data[settings.USER] = signup_serializer.data
response = GetAccesUtility.data_wrapper(response_data)
return Response(response, status=status.HTTP_200_OK)
else:
response['error'] = Messages.NOT_AUTHENTICATED # error_data
response["status_code"] = settings.HTTP_USER_ERROR
return Response(response)
user = authenticate(用户名=用户名, password=密码)
Django authenticate 函数验证用户用户名或密码和 return 用户信息。如果它是 return 用户,那么会生成一个新的 访问令牌 并且 return 以状态 200 响应,否则如果用户不是 return 通过身份验证的功能然后错误消息 return 作为回应。
问题出在使用 [=e10=] 而不是 User.objects.create_superuser()
,感谢 @C14L。
我正在使用 Django REST Framework 构建简单的 API,使用 curl 和 API 网络管理员一切正常,但是如果我 运行 以下测试:
class OrderTest(APITestCase):
username = 'admin'
password = '12345'
def setUp(self):
User.objects.create(
username=self.username,
password=self.password,
email='demo@demo.com',
is_superuser=True,
is_staff=True
)
def test_create_order_by_admin(self):
url = '/api/orders/'
data = {
'name': 'John Doe',
'phone': '380000000000',
'status': 1,
'email': 'jonhn.doe@gmail.com',
'date': datetime.now(),
}
# Cheking if user exist
self.assertEqual(User.objects.get(pk=1).username, self.username)
self.client.login(
username=self.username,
password=self.password,
)
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Order.objects.count(), 1)
for key, value in data.items():
self.assertEqual(Order.objects.get().key, value)
失败并出现以下错误:
Failure
Traceback (most recent call last):
File "/home/linevich/projects/swebion.com/project/order_form/tests.py", line 71, in test_create_order_by_admin
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
AssertionError: 403 != 201
这意味着 client.login()
不工作。
有什么想法吗?
您不应该直接设置密码。这将以明文形式存储密码,而 Django 将在尝试登录时尝试哈希算法。 请参阅 set_password 以加密存储。
使用authenticate函数代替client.login
这里我使用基于通用 class 的视图来登录用户..
class 登录(generics.CreateAPIView): ''' API 用于登录到 return 用户模型以及访问令牌。 '''
def post(self, request, *args, **kwargs):
username = self.request.data.get('email', None)
password = self.request.data.get('password', None)
user = authenticate(username=username, password=password)
response = {}
if user:
access = AppCustomMethods()
access_token = access.create_access_token(user, request,
settings.XAMARIN_APPLICATION_NAME)
response_data = {}
response_data['access_token'] = access_token
signup_serializer = serializers.GetUserWithAllBusinesses(user)
response_data[settings.USER] = signup_serializer.data
response = GetAccesUtility.data_wrapper(response_data)
return Response(response, status=status.HTTP_200_OK)
else:
response['error'] = Messages.NOT_AUTHENTICATED # error_data
response["status_code"] = settings.HTTP_USER_ERROR
return Response(response)
user = authenticate(用户名=用户名, password=密码)
Django authenticate 函数验证用户用户名或密码和 return 用户信息。如果它是 return 用户,那么会生成一个新的 访问令牌 并且 return 以状态 200 响应,否则如果用户不是 return 通过身份验证的功能然后错误消息 return 作为回应。
问题出在使用 [=e10=] 而不是 User.objects.create_superuser()
,感谢 @C14L。