1

Я строю простой API с Django REST Framework, все работает как с завитком и 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': 'jonhn.doe[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

btw это не связано с вашей проблемой, но я рекомендую удалить первое утверждение (одно о имени пользователя), потому что это не то, что вы здесь тестируете. Просто сохраните 'self.user = User (...)' в методе setUp. – wim

+0

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

ответ

0

Проблема была в использовании User.objects.create() insetad User.objects.create_superuser(), благодаря @C14L.

2

Нельзя устанавливать пароль напрямую. Это сохранит пароль в текстовом формате, а Django попробует алгоритм хеширования при попытке входа в систему. См. set_password, чтобы сохранить его в зашифрованном виде.

1

Использование аутентификации функции вместо client.login

Здесь я использую общий вид на основе класса для входа пользователя ..

класс Логин (generics.CreateAPIView): '' ' API для SignIn для возврата моделей пользователей вместе с токеном доступа. «»»

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) 

пользователя = аутентификации (имя пользователя = имя пользователя, пароль = пароль)

Джанго аутентификации функции аутентификации имя пользователя или пароль пользователя и вернуть данные пользователя. Если он возвращает пользователя, то генерируется новый токен и возвращается в ответ со статусом 200 else, если пользователь не возвращает аутентифицированную функцию, тогда сообщение об ошибке возвращается в ответ.

+0

На самом деле проблема заключалась в использовании 'User.objects.create()' insetad 'User.objects.create_superuser()', но спасибо за совет! –

Смежные вопросы