Django 2.1 Запрос на сопоставление токенов не существует - PullRequest
0 голосов
/ 07 апреля 2019

Я пытался реализовать аутентификацию пользователей в Django, используя rest_framework.authtoken, как в , это руководство . Мои тестовые случаи, которые проверяют ряд различных ошибок, которые могут возникнуть при входе пользователя в систему, работают правильно, прежде чем токены доступа будут введены в код.

По какой-то причине, когда я добавляю проверку на токен, возвращенный в Http-ответе, я получаю сообщение об ошибке:

rest_framework.authtoken.models.Token.DoesNotExist: Token matching query does not exist.

Я добавил во все соответствующие операции импорта, которые необходимы для проверки на токены, чтобы могла быть функция, которая была перемещена в другую библиотеку в одной из последних версий django? Что может быть причиной проблемы?

test.py

from django.urls import reverse 
from rest_framework.test import APITestCase
from django.contrib.auth.models import User
from rest_framework import status
from rest_framework.authtoken.models import Token


class AccountsTest(APITestCase):
    def setUp(self):
        # We want to go ahead and originally create a user. 
        self.test_user = User.objects.create_user('testuser', 'test@example.com', 'testpassword')
        print('test user:' + str(self.test_user))

        # URL for creating an account.
        self.create_url = reverse('account-create')

    def test_create_user(self):
        """
        Ensure we can create a new user and a valid token is created with it.
        """
        data = {
                'username': 'foobar',
                'email': 'foobar@example.com',
                'password': 'somepassword'
                }

        response = self.client.post(self.create_url , data, format='json')
        user = User.objects.latest('id')

        token = Token.objects.get(user=user)
        self.assertEqual(response.data['token'], token.key)

views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from accounts.serializers import UserSerializer
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token

class UserCreate(APIView):
    """ 
    Creates the user. 
    """

    def post(self, request, format='json'):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            if user:
                token = Token.objects.create(user=user)
                json = serializer.data
                json['token'] = token.key
                return Response(json, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #third party
    'rest_framework',
    'rest_framework.authtoken',

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ),
}

1 Ответ

0 голосов
/ 08 апреля 2019

Поскольку ваш файл настроек имеет следующий класс разрешений, он будет применяться ко всем представлениям, которые расширяются APIView

'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticatedOrReadOnly', )

Итак, установите default config as same., Переопределите его, установив атрибут permission_classes в APIView, как следует.

from rest_framework.permissions import AllowAny
class UserCreate(APIView):
     permission_classes = (AllowAny,)
...