1

我建立简单的API与Django的REST框架,一切正常,卷曲和API网络管理员预期,但如果我运行下面的测试:Django REST Framework client.login()不起作用。 (用户创建的)

class OrderTest(APITestCase): 
    username = 'admin' 
    password = '12345' 

    def setUp(self): 
     User.objects.create(
      username=self.username, 
      password=self.password, 
      email='[email protected]', 
      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': '[email protected]', 
      '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()无法正常工作。 任何想法?

+0

'self.client.login'的返回值是什么? – wim

+0

顺便说一句,这与你的问题没有关系,但我建议删除第一个断言(关于用户名的那个),因为这不是你在这里测试的东西。只需将'self.user = User(...)'保存在setUp方法中即可。 – wim

+0

User.objects.create_user(['user','[email protected]','password']) – C14L

回答

0

问题在于使用User.objects.create()插入的User.objects.create_superuser(),感谢@C14L

2

您不应该直接设置密码。这将以明文形式存储密码,而Django在尝试登录时会尝试使用哈希算法。 请参阅set_password将其加密存储。在地方

1

使用认证功能client.login

这里我用的通用基础类视图登录用户..

类登录(generics.CreateAPIView)的: '' ' SignIn返回用户模型以及访问令牌的API。 ''”

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) 

用户认证=(用户名=用户名,密码=密码)

的Django 认证功能认证用户的用户名或口令和返回用户信息。如果它返回用户,则会生成一个新的访问令牌,并返回响应状态200,否则如果用户未通过身份验证功能返回,则会返回错误消息作为响应。

+0

其实问题在于使用'User.objects.create_superuser()'User.objects.create()'insetad,但感谢您的建议! –

相关问题