Когда я проверяю свой маршрут POST для API Django Rest Framework, он возвращает 401, не прошедший проверку подлинности, даже если он вошел в систему - PullRequest
0 голосов
/ 28 октября 2018

Когда я пытаюсь проверить мой маршрут Create / POST для моего API Django Rest Framework, я получаю код состояния ответа 401 с подробным описанием ошибки, указывающим мне ErrorDetail(string=u'Authentication credentials were not provided.', code=u'not_authenticated').Странная вещь, я Django говорит мне, что я аутентифицирован, когда я проверяю is_authenticated.

У кого-нибудь есть идеи, что может быть причиной этого?Весь соответствующий код указан ниже.

# test_api.py

def authorise_user_and_test_is_authenticated(self, user_id):
    """
    Log in user and test this is successful
    """
    user = User.objects.get(pk=user_id)
    self.client.login(username=user.username, password=user.password)
    authorised_user = auth.get_user(self.client)
    return self.assertTrue(user.is_authenticated())

def test_create_project(self):
    '''
        When given valid parameters a project is created.
    '''
    user = User.objects.get(username="user_001")
    self.authorise_user_and_test_is_authenticated(user.id) # pass of authenication and auth testing to method, when tested with is_authenicated() it returns true.

    response = self.client.post('/api/user/{0}/project/create/'.format(user.id),
                                 json.dumps({"model_name": "POSTed Project",
                                             "description": "Project tested by posting",
                                             "shared_users[]": [2]
                                             }),
                                 content_type='application/json')

    self.assertEqual(response.status_code, 201)

# views.py

class MyCreateView(generics.GenericAPIView):
    pass
    serializer_class = FerronPageCreateAndUpdateSerializer

    def get_queryset(self):
        return User.objects.filter(pk=self.kwargs.get('user'))

    def post(self, request, format=None, **kwargs):
        # This dictionary is used to ensure that the last_modified_by field is always updated on post to be the current user
        print request.data
        request_data = {
            'user': request.user.id,
            'model_name': request.data['model_name'],
            'description': request.data['description'],
            'last_modified_by': request.user.id,
            'shared_users': request.data.getlist('shared_users[]', [])
        }
        serializer = FerronPageCreateAndUpdateSerializer(data=request_data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

# settings.py

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': (
       'rest_framework.authentication.TokenAuthentication',
       'rest_framework.authentication.SessionAuthentication'
   ),
}

# url matcher

url(r'^user/(?P<user>\d+)/project/create/$', MyCreateView.as_view(), name='create-project')

class FerronPageCreateAndUpdateSerializer(serializers.ModelSerializer):
shared_users = serializers.PrimaryKeyRelatedField(many=True, queryset=User.objects.all(), read_only=False)
description  = serializers.CharField(max_length=300, trim_whitespace=True, required=False, allow_blank=True)

class Meta:
    model = Project
    fields = [
      'pk',
      'user',
      'data',
      'model_name',
      'description',
      'created_at',
      'date_modified',
      'shared_users',
      'last_modified_by'

]

1 Ответ

0 голосов
/ 11 ноября 2018

Оказалось, что проблема была здесь self.client.login(username=user.username, password=user.password) в методе authorise_user_and_test_is_authenticated(self, user_id).

Проблема заключалась в том, что я использовал пароль, экземпляр пользователя, которого я уже создал.Это означало, что когда я дал аргумент password=user.password, я пытался войти в систему, используя уже хешированный пароль.Вместо этого мне нужно было войти в систему с оригинальной нехэшированной версией пароля, например password='openseasame'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...