AttributeError: объект 'Clients' не имеет атрибута 'is_authenticated' в django-restframework

Я хочу реализовать пользовательскую авторизацию клиента в проекте Django-restframework, но столкнулся со следующей ошибкой:

File "D:\Projects\Python Projects\blog_posts\backend\venv\lib\site-packages\rest_framework\permissions.py", line 137, in has_permission
    return bool(request.user and request.user.is_authenticated)
AttributeError: 'Clients' object has no attribute 'is_authenticated'
[15/Dec/2021 17:10:23] "GET /api/admin/postList HTTP/1.1" 500 102946

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

Я использую:

  • Django==3.2.9
  • djangorestframework==3.12.4

Я получаю идентификатор клиента из заголовка запроса клиента следующим образом:

from users.models import Clients
from rest_framework import authentication
from rest_framework import exceptions
from rest_framework import permissions


class ClientAuthentication(authentication.BaseAuthentication):

    def authenticate(self, request):
        clientID = request.headers.get('client')
        print("client id: ", clientID)
        if not clientID:  # no username passed in request headers
            raise exceptions.AuthenticationFailed('Client ID is Required')

        try:
            client = Clients.objects.get(id=clientID)  # get the client id
        except Clients.DoesNotExist:
            # raise exception if user does not exist
            raise exceptions.AuthenticationFailed('Client ID is Not Valid')

        return (client, None)  # authentication successful

Мой файл конфигурации setting.py выглядит так:


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # custom apps adding from here...
    'blog',
    'blog_api',
    "rest_framework",
    "corsheaders",
    "users",

    # authentication apps
    "rest_framework_simplejwt.token_blacklist",
]


# django rest-framework settings...
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'core.authorization.ClientAuthentication',
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),

    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
        # 'core.authorization.BlocklistPermission',
    ]

}

** моя модель клиента выглядит следующим образом **

class Clients(models.Model):
    email = models.EmailField(_('email address'), unique=True)
    client_name = models.CharField(max_length=250, unique=True)
    joint_date = models.DateTimeField(default=timezone.now)
    is_active = models.BooleanField(default=False)

    class Meta:
        # managed = False
        db_table = 'client'

    def __str__(self):
        return self.client_name

Данные в таблице базы данных: enter image description here

is_authenticated - это свойство модели по умолчанию User. Для того чтобы вы могли использовать этот метод, вы должны убедиться, что ваша модель Clients наследует эту модель auth по умолчанию. Например, так

from django.contrib.auth.models import AbstractUser

class Clients(AbstractUser):
    [.. custom fields ..]

См. Django Docs - Using a custom user model when starting a project для получения дополнительной информации об этом.

Вернуться на верх