Очевидно, что это не лучшее решение, потому что оно будет циклически просматривать всю мою базу данных моделей. Как я могу сделать этот запрос наиболее эффективным способом?

Здравствуйте, Я работаю над проектом, где я использовал django-rest-knox для аутентификации токенов. У меня есть сомнения, что

1.Как использовать токен, который возвращается при регистрации и входе в систему.
(
когда я передаю токен в postman как, например,
. в разделе заголовка

Токен аутентификации abcjdkkfjjrhehrjlajn@kfjdk

)
это не работает

2.когда я вызываю конечную точку logout и logoutall, она говорит

{ "detail": "Учетные данные для аутентификации не были предоставлены". }

даже несмотря на то, что я передал все правильные учетные данные.

Вот код, которому я следую,

в файле setting.py


REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        'knox.auth.TokenAuthentication',
        "rest_framework.authentication.BasicAuthentication", 
        "rest_framework.authentication.SessionAuthentication",)}

REST_AUTH_TOKEN_MODEL = 'knox.models.AuthToken'
REST_AUTH_TOKEN_CREATOR = 'users.authentication.create_knox_token'
REST_AUTH_SERIALIZERS = {
    'USER_DETAILS_SERIALIZER': 'users.serializers.CustomUserSerializer',
    'TOKEN_SERIALIZER': 'users.serializers.KnoxSerializer'
}
<
path('auth/register/',KnoxRegisterView.as_view(),name='register'),
path('auth/login/',KnoxLoginView.as_view(),name='login'),
path('api/auth/logout/',knox_view.LogoutView.as_view(),name='knox_login'),
path('api/auth/logoutall/',knox_view.LogoutAllView.as_view(),name='knox_alllogin'),

в authentication.py


from knox.models import AuthToken


def create_knox_token(token_model, user, serializer):
    token = AuthToken.objects.create(user=user)
    return token

в serializers.py



class KnoxSerializer(serializers.Serializer):
    """
    Serializer for Knox authentication.
    """
    token=serializers.CharField()
    user = CustomUserDetailsSettingsSerializer()

в файле views.py

class KnoxRegisterView(RegisterView):

    def get_response_data(self, user):
        return KnoxSerializer({'user': user, 'token': self.token}).data

    def perform_create(self, serializer):
        user = serializer.save(self.request)
        self.token = create_knox_token(None, user, None)
        complete_signup(self.request._request, user, allauth_settings.EMAIL_VERIFICATION, None)
        return user

class KnoxLoginView(LoginView):

    def get_response(self):
        serializer_class = self.get_response_serializer()

        data = {
            'user': self.user,
            'token': self.token
        }
        serializer = serializer_class(instance=data, context={'request': self.request})
        return Response(serializer.data, status=200)

Я не уверен, но думаю, что ваша проблема в том, что вам нужно переопределить представление login, чтобы оно не запрашивало аутентификацию. Обычно rest framework настраивается следующим образом:

# setting.py
REST_FRAMEWORK = {
  'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
   ),
}

Итак, ваш фреймворк считает, что ему нужна аутентификация для ВСЕХ представлений, включая представление login (что, конечно, глупо). Решение состоит в том, чтобы переписать представление входа в систему как документационное примечание:

Если это ваш единственный класс аутентификации по умолчанию, не забудьте переписать Knox's LoginView, иначе он не будет работать, поскольку представление входа в систему будет требовать токен аутентификации для генерации нового токена, делая его непригодным для использования.

Попробуйте добавить к вашему представлению входа:

class KnoxLoginView(LoginView):
...
permission_classes = (permissions.AllowAny,)
...
Вернуться на верх