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
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 для получения дополнительной информации об этом.