Привет, я пытаюсь отобразить хешированный пароль в API для просмотра.Я переключил стандартный алгоритм хеширования на Bcrypt.Кажется, я не могу хэшировать поле пароля на моем сериализаторе, я делал это раньше в другом проекте и ссылался на него, но все то же самое.Может ли кто-нибудь помочь мне с этим?Примечание. Хеширование работает в консоли при регистрации суперпользователя.Теперь я создал сериализатор для административного пользователя и не могу отображать хэш в доступном для просмотра API, как мой предыдущий проект.
from rest_framework import serializers
from App1.models import (AdminUser, RegularUser)
#--------------------------ADMIN SERIALIZER REGISTER------------------------
class AdminUserSerializer(serializers.ModelSerializer):
""" This is a serializer connected to the AdminUser model in models.py
used to register a new Admin with full permissions. """
id = serializers.ReadOnlyField()
password = serializers.CharField(max_length=255,
style={'input_type':'password'})
class Meta:
model = AdminUser
fields = ('id', 'ADMIN_PROFILE_PIC','admin_date_of_birth',
'admin_first_name', 'admin_last_name', 'admin_email', 'password',
'admin_phone_number',)
read_only_fields = ('id', 'last_login', 'admin_date_joined',)
depth = 1
extra_kwargs = {'password':{'write_only':True}}
def create(self, validated_data):
""" This creates an Admin User instance """
new_admin = AdminUser(
ADMIN_PROFILE_PIC=validated_data['ADMIN_PROFILE_PIC'],
admin_first_name=validated_data['admin_first_name'],
admin_last_name=validated_data['admin_last_name'],
admin_email=validated_data['admin_email'],
admin_phone_number=validated_data['admin_phone_number'],
)
new_admin.set_password(validated_data['password'])
new_admin.save()
return new_admin
#------------------------------END---------------------------------------
-------------------------------VIEWS.PY----------------------------------
from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status
from rest_framework import filters
from rest_framework.decorators import action
from App1.models import (AdminUser, RegularUser)
from App1.serializers import (AdminUserSerializer, RegularUserSerializer)
from rest_framework.authentication import (TokenAuthentication)
# Create your views here.
#----------------------------ADMIN MODEL VIEWSET--------------------------
class AdminUserViewset(viewsets.ModelViewSet):
""" This is a viewset to display a registration form to create
a new user """
queryset = AdminUser.objects.all()
serializer_class = AdminUserSerializer
filter_backends = (filters.SearchFilter,)
authentication_classes = (TokenAuthentication,)
search_fields = ('id','admin_first_name', 'admin_email', 'admin_last_name',
'admin_phone_number')
@action(methods=['POST'], detail=True)
def set_password(self, request, pk=None):
""" This creates a user instance and finalizes our serializer """
serializer = AdminUserSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
admin_user_now.save()
admin_first_name = serializer.data.get('admin_first_name')
admin_last_name = serializer.data.get('admin_last_name')
message = ("Hellow {} {} welcome to Bonky").format(admin_first_name, admin_last_name)
return Response({'message':message})
else:
return Response(serializer.errors,
status=status.HTTP_404_BAD_REQUEST)
#---------------------------------END------------------------------------
#------------------------------MODELS.PY-------------------------------
from django.db import models
from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser,
PermissionsMixin)
from datetime import datetime
# Create your models here.
#------------------------- Admin User Model class------------------------
class AdminUserModelManager(BaseUserManager):
""" This is a model manager to provide updates and perform operations
like crud (Create, Read, Update, Delete) to the admin.py """
def create_user(self, admin_first_name, admin_last_name,
admin_email, admin_phone_number, admin_date_of_birth, password=None):
""" This will create a admin user in our database """
if not admin_first_name:
raise ValueError("Please enter in a first name.")
if not admin_last_name:
raise ValueError("Please enter in a last name.")
if not admin_email:
raise ValueError("Please enter in a email.")
admin_email = self.normalize_email(admin_email)
admin_user = self.model(
admin_first_name=admin_first_name,
admin_last_name=admin_last_name,
admin_email=admin_email,
admin_phone_number=admin_phone_number,
admin_date_of_birth=admin_date_of_birth,
)
admin_user.set_password(password)
admin_user.save(using=self._db)
return admin_user
def create_superuser(self, admin_first_name, admin_last_name, admin_email,
admin_phone_number, admin_date_of_birth, password):
""" this create a superuser in our database. """
new_admin_user = self.create_user(
admin_first_name=admin_first_name,
admin_last_name=admin_last_name,
password=password,
admin_email=admin_email,
admin_phone_number=admin_phone_number,
admin_date_of_birth=admin_date_of_birth,
)
new_admin_user.is_staff = True
new_admin_user.is_admin = True
new_admin_user.is_superuser = True
new_admin_user.is_active = True
return new_admin_user
# Points to the AdminUserModel
class AdminUser(AbstractBaseUser, PermissionsMixin):
""" This class points to the AdminUserModelManager class and also
inherits from PermissionsMixin class (predefined Django class) """
# Admin Profle Photo
ADMIN_PROFILE_PIC = models.ImageField(null=True, blank=True,
upload_to='App1/static/images/', verbose_name='Profile Photo')
admin_first_name = models.CharField(verbose_name='first name', max_length=255)
admin_last_name = models.CharField(verbose_name='last name', max_length=255)
admin_email = models.EmailField(verbose_name='email address',
max_length=255, unique=True)
admin_phone_number = models.CharField(verbose_name='phone number', max_length=255)
admin_date_of_birth = models.DateField(verbose_name='date of birth',
null=True, blank=True)
admin_date_joined = models.DateField(auto_now_add=True)
is_staff = models.BooleanField(default=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=True)
# POINTER TO THE ADMINUSERMODEL CLASS
objects = AdminUserModelManager()
USERNAME_FIELD = 'admin_email'
REQUIRED_FIELDS = ['admin_first_name', 'admin_last_name', 'admin_phone_number',
'admin_date_of_birth']
def get_full_name(self):
""" Will get the full name of a administrative user """
return self.admin_first_name
def get_short_name(self):
""" Gets the short/nickname of the administrative user """
return self.admin_first_name
def get_username(self):
""" This gets the username of the _ADMIN USER """
return self.admin_email
def __str__(self):
""" Django needs this so it can give us a string representation
of the object and it's fields """
return (self.admin_first_name + ' ' + self.admin_last_name +
' ' + self.admin_email)
#----------------------------END ADMIN MODEL-----------------------------