2

私は Django REST Framework で単純な API を構築しています。curl と API Web 管理ではすべてが期待どおりに機能しますが、次のテストを実行すると:

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()いないということです。何か案は?

4

3 に答える 3

2

パスワードを直接設定しないでください。これにより、パスワードが平文で保存されますが、Django はログイン時にハッシュ アルゴリズムを試行します。暗号化して保存するには、 set_passwordを参照してください。

于 2016-03-29T18:16:15.287 に答える
1

client.loginの代わりに認証機能を使用する

ここでは、ジェネリック クラス ベースのビューを使用してユーザーをログインさせます。

class 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 で応答が返されます。それ以外の場合、ユーザーが認証済み関数によって返されなかった場合、応答でエラー メッセージが返されます。

于 2016-03-30T04:01:27.857 に答える
1

@C14Lのおかげで、 User.objects.create()insetad of の使用に問題がありました。User.objects.create_superuser()

于 2016-03-30T18:41:48.593 に答える