Python 3.x Django rest框架序列化程序不会散列密码
您好,我正在尝试在可浏览的api中显示哈希密码。我已将标准哈希算法切换为Bcrypt。我似乎不能在我的序列化程序上散列密码字段,我以前在另一个项目上做过,并引用过它,但一切都是一样的。有人能帮我吗? 注意:当注册超级用户时,哈希在控制台中工作。现在,我为一个管理用户制作了一个序列化程序,不能像我以前的项目那样在可浏览的api中显示哈希值。Python 3.x Django rest框架序列化程序不会散列密码,python-3.x,django-rest-framework,django-2.1,Python 3.x,Django Rest Framework,Django 2.1,您好,我正在尝试在可浏览的api中显示哈希密码。我已将标准哈希算法切换为Bcrypt。我似乎不能在我的序列化程序上散列密码字段,我以前在另一个项目上做过,并引用过它,但一切都是一样的。有人能帮我吗? 注意:当注册超级用户时,哈希在控制台中工作。现在,我为一个管理用户制作了一个序列化程序,不能像我以前的项目那样在可浏览的api中显示哈希值。 User serializer.save()而不是User admin\u User\u now.save()。不确定问题出在哪里,但这里有一个与序列化器和视
User serializer.save()而不是User admin\u User\u now.save()。不确定问题出在哪里,但这里有一个与
序列化器和视图
相结合的工作模式
要求:Django==2.1,djangorestframework==3.9.0
目标:哈希密码
型号.PY
from django.db import models
from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser,
PermissionsMixin)
# Create your models here.
#---------------------------ADMIN CUSTOMIZATION---------------------------------
class ManagerialUser(BaseUserManager):
""" This is a manager to perform duties such as CRUD(Create, Read,
Update, Delete) """
def create_user(self, email, name, password=None):
""" This creates a admin user object """
if not email:
raise ValueError("It is mandatory to require an email!")
if not name:
raise ValueError("Please provide a name:")
email = self.normalize_email(email=email)
user = self.model(email=email, name=name)
""" This will allow us to store our password in our database
as a hash """
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, name, password):
""" This creates a superuser for our Django admin interface"""
user = self.create_user(email, name, password)
user.is_superuser = True
user.is_staff = True
user.save(using=self._db)
return user
class AdminUser(AbstractBaseUser, PermissionsMixin):
""" This represents a admin User in the system and gives specific permissions
to this class. This class wont have staff permissions """
# We do not want any email to be the same in the database.
email = models.EmailField(max_length=255, unique=True)
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name',]
# CLASS POINTER FOR CLASS MANAGER
objects = ManagerialUser()
def get_full_name(self):
""" This function returns a users full name """
return self.name
def get_short_name(self):
""" This will return a short name or nickname of the admin user
in the system. """
return self.name
def __str__(self):
""" A dunder string method so we can see a email and or
name in the database """
return self.name + ' ' + self.email
#--------------------------END AMDIM CLASSES------------------------------------
#--------------------------Start Regular Users----------------------------------
class RegularUserManager(BaseUserManager):
""" Manages the regular everyday users in our database """
def create_user(self, email, name, password=None):
""" This creates a regular user in our system """
if not email:
raise ValueError("Please enter in an email!")
if not name:
raise ValueError("Please enter in a first name!")
def normalize_email(self):
""" This will make the every regular users email lowercase """
email = normalize_email(email=email)
user = self.model(email=email, name=name)
return user
def set_password(self, password):
""" This allows the regular user to set a set_password and hash
it in our database """
user = self.create_user(email, name, password)
user.is_superuser = False
user.is_staff = False
user.is_active = False
user.set_password(password)
user.save(using=self._db)
return user
class RegularUser(AbstractBaseUser):
""" A regular user in our database and they're permissions """
email = models.EmailField(max_length=255, unique=True)
name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
phone_number = models.CharField(max_length=20)
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name',]
# THIS POINTS TO OUR CLASS MANAGER
objects = RegularUserManager()
def get_full_name(self):
""" Gets full name of the regular user """
return self.name
def get_short_name(self):
""" Gets short or nickname of the regular user """
return self.name
def __str__(self):
""" Dunder method defined to return a readable copy of a string """
return self.name + ' ' + self.last_name + ' ' + self.email
from rest_framework import serializers
from datetime import datetime
from App1.models import (AdminUser, RegularUser)
class ProfileSerializer(serializers.ModelSerializer):
""" A serializer for our user profiles """
id = serializers.ReadOnlyField()
is_active = serializers.ReadOnlyField()
password = serializers.CharField(max_length=255,
style={'input_type': 'password'})
class Meta:
model = RegularUser
fields = ['id', 'is_active', 'name',
'last_name','email','password', 'phone_number']
extra_kwargs = {'password': {'write_only':True}}
def create(self, validated_data):
""" Creates and returns a new user """
# Validating Data
user = RegularUser(
name=validated_data['name'],
last_name=validated_data['last_name'],
email=validated_data['email'],
phone_number=validated_data['phone_number'],
)
user.set_password(validated_data['password'])
user.save()
return user
from django.shortcuts import render
from rest_framework.response import Response
from App1.serializers import (ProfileSerializer)
from rest_framework import status
from rest_framework import viewsets
from App1.models import (AdminUser, RegularUser)
from rest_framework.authentication import TokenAuthentication
from rest_framework import filters
# Create your views here.
class RegularAPIViewSet(viewsets.ModelViewSet):
""" The functionallity of this class allows the user to register
themeselves as a regular based user in our system """
queryset = RegularUser.objects.all()
serializer_class = ProfileSerializer
filter_backends = (filters.SearchFilter,)
search_fields = ('name', 'email', 'phone_number')
def create(self, request):
""" This validates and saves the registered regular user
in the database. """
serializer = ProfileSerializer(data=request.data)
queryset = RegularUser.objects.all()
if serializer.is_valid():
serializer.save()
id = serializer.data.get('id')
name = serializer.data.get('name')
last_name = serializer.data.get('last_name')
message = "Hellow ID:{}, {} {}".format(id, name, last_name)
return Response({'message':message})
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
序列化程序.PY
from django.db import models
from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser,
PermissionsMixin)
# Create your models here.
#---------------------------ADMIN CUSTOMIZATION---------------------------------
class ManagerialUser(BaseUserManager):
""" This is a manager to perform duties such as CRUD(Create, Read,
Update, Delete) """
def create_user(self, email, name, password=None):
""" This creates a admin user object """
if not email:
raise ValueError("It is mandatory to require an email!")
if not name:
raise ValueError("Please provide a name:")
email = self.normalize_email(email=email)
user = self.model(email=email, name=name)
""" This will allow us to store our password in our database
as a hash """
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, name, password):
""" This creates a superuser for our Django admin interface"""
user = self.create_user(email, name, password)
user.is_superuser = True
user.is_staff = True
user.save(using=self._db)
return user
class AdminUser(AbstractBaseUser, PermissionsMixin):
""" This represents a admin User in the system and gives specific permissions
to this class. This class wont have staff permissions """
# We do not want any email to be the same in the database.
email = models.EmailField(max_length=255, unique=True)
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name',]
# CLASS POINTER FOR CLASS MANAGER
objects = ManagerialUser()
def get_full_name(self):
""" This function returns a users full name """
return self.name
def get_short_name(self):
""" This will return a short name or nickname of the admin user
in the system. """
return self.name
def __str__(self):
""" A dunder string method so we can see a email and or
name in the database """
return self.name + ' ' + self.email
#--------------------------END AMDIM CLASSES------------------------------------
#--------------------------Start Regular Users----------------------------------
class RegularUserManager(BaseUserManager):
""" Manages the regular everyday users in our database """
def create_user(self, email, name, password=None):
""" This creates a regular user in our system """
if not email:
raise ValueError("Please enter in an email!")
if not name:
raise ValueError("Please enter in a first name!")
def normalize_email(self):
""" This will make the every regular users email lowercase """
email = normalize_email(email=email)
user = self.model(email=email, name=name)
return user
def set_password(self, password):
""" This allows the regular user to set a set_password and hash
it in our database """
user = self.create_user(email, name, password)
user.is_superuser = False
user.is_staff = False
user.is_active = False
user.set_password(password)
user.save(using=self._db)
return user
class RegularUser(AbstractBaseUser):
""" A regular user in our database and they're permissions """
email = models.EmailField(max_length=255, unique=True)
name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
phone_number = models.CharField(max_length=20)
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name',]
# THIS POINTS TO OUR CLASS MANAGER
objects = RegularUserManager()
def get_full_name(self):
""" Gets full name of the regular user """
return self.name
def get_short_name(self):
""" Gets short or nickname of the regular user """
return self.name
def __str__(self):
""" Dunder method defined to return a readable copy of a string """
return self.name + ' ' + self.last_name + ' ' + self.email
from rest_framework import serializers
from datetime import datetime
from App1.models import (AdminUser, RegularUser)
class ProfileSerializer(serializers.ModelSerializer):
""" A serializer for our user profiles """
id = serializers.ReadOnlyField()
is_active = serializers.ReadOnlyField()
password = serializers.CharField(max_length=255,
style={'input_type': 'password'})
class Meta:
model = RegularUser
fields = ['id', 'is_active', 'name',
'last_name','email','password', 'phone_number']
extra_kwargs = {'password': {'write_only':True}}
def create(self, validated_data):
""" Creates and returns a new user """
# Validating Data
user = RegularUser(
name=validated_data['name'],
last_name=validated_data['last_name'],
email=validated_data['email'],
phone_number=validated_data['phone_number'],
)
user.set_password(validated_data['password'])
user.save()
return user
from django.shortcuts import render
from rest_framework.response import Response
from App1.serializers import (ProfileSerializer)
from rest_framework import status
from rest_framework import viewsets
from App1.models import (AdminUser, RegularUser)
from rest_framework.authentication import TokenAuthentication
from rest_framework import filters
# Create your views here.
class RegularAPIViewSet(viewsets.ModelViewSet):
""" The functionallity of this class allows the user to register
themeselves as a regular based user in our system """
queryset = RegularUser.objects.all()
serializer_class = ProfileSerializer
filter_backends = (filters.SearchFilter,)
search_fields = ('name', 'email', 'phone_number')
def create(self, request):
""" This validates and saves the registered regular user
in the database. """
serializer = ProfileSerializer(data=request.data)
queryset = RegularUser.objects.all()
if serializer.is_valid():
serializer.save()
id = serializer.data.get('id')
name = serializer.data.get('name')
last_name = serializer.data.get('last_name')
message = "Hellow ID:{}, {} {}".format(id, name, last_name)
return Response({'message':message})
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
视图.PY
from django.db import models
from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser,
PermissionsMixin)
# Create your models here.
#---------------------------ADMIN CUSTOMIZATION---------------------------------
class ManagerialUser(BaseUserManager):
""" This is a manager to perform duties such as CRUD(Create, Read,
Update, Delete) """
def create_user(self, email, name, password=None):
""" This creates a admin user object """
if not email:
raise ValueError("It is mandatory to require an email!")
if not name:
raise ValueError("Please provide a name:")
email = self.normalize_email(email=email)
user = self.model(email=email, name=name)
""" This will allow us to store our password in our database
as a hash """
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, name, password):
""" This creates a superuser for our Django admin interface"""
user = self.create_user(email, name, password)
user.is_superuser = True
user.is_staff = True
user.save(using=self._db)
return user
class AdminUser(AbstractBaseUser, PermissionsMixin):
""" This represents a admin User in the system and gives specific permissions
to this class. This class wont have staff permissions """
# We do not want any email to be the same in the database.
email = models.EmailField(max_length=255, unique=True)
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name',]
# CLASS POINTER FOR CLASS MANAGER
objects = ManagerialUser()
def get_full_name(self):
""" This function returns a users full name """
return self.name
def get_short_name(self):
""" This will return a short name or nickname of the admin user
in the system. """
return self.name
def __str__(self):
""" A dunder string method so we can see a email and or
name in the database """
return self.name + ' ' + self.email
#--------------------------END AMDIM CLASSES------------------------------------
#--------------------------Start Regular Users----------------------------------
class RegularUserManager(BaseUserManager):
""" Manages the regular everyday users in our database """
def create_user(self, email, name, password=None):
""" This creates a regular user in our system """
if not email:
raise ValueError("Please enter in an email!")
if not name:
raise ValueError("Please enter in a first name!")
def normalize_email(self):
""" This will make the every regular users email lowercase """
email = normalize_email(email=email)
user = self.model(email=email, name=name)
return user
def set_password(self, password):
""" This allows the regular user to set a set_password and hash
it in our database """
user = self.create_user(email, name, password)
user.is_superuser = False
user.is_staff = False
user.is_active = False
user.set_password(password)
user.save(using=self._db)
return user
class RegularUser(AbstractBaseUser):
""" A regular user in our database and they're permissions """
email = models.EmailField(max_length=255, unique=True)
name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
phone_number = models.CharField(max_length=20)
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name',]
# THIS POINTS TO OUR CLASS MANAGER
objects = RegularUserManager()
def get_full_name(self):
""" Gets full name of the regular user """
return self.name
def get_short_name(self):
""" Gets short or nickname of the regular user """
return self.name
def __str__(self):
""" Dunder method defined to return a readable copy of a string """
return self.name + ' ' + self.last_name + ' ' + self.email
from rest_framework import serializers
from datetime import datetime
from App1.models import (AdminUser, RegularUser)
class ProfileSerializer(serializers.ModelSerializer):
""" A serializer for our user profiles """
id = serializers.ReadOnlyField()
is_active = serializers.ReadOnlyField()
password = serializers.CharField(max_length=255,
style={'input_type': 'password'})
class Meta:
model = RegularUser
fields = ['id', 'is_active', 'name',
'last_name','email','password', 'phone_number']
extra_kwargs = {'password': {'write_only':True}}
def create(self, validated_data):
""" Creates and returns a new user """
# Validating Data
user = RegularUser(
name=validated_data['name'],
last_name=validated_data['last_name'],
email=validated_data['email'],
phone_number=validated_data['phone_number'],
)
user.set_password(validated_data['password'])
user.save()
return user
from django.shortcuts import render
from rest_framework.response import Response
from App1.serializers import (ProfileSerializer)
from rest_framework import status
from rest_framework import viewsets
from App1.models import (AdminUser, RegularUser)
from rest_framework.authentication import TokenAuthentication
from rest_framework import filters
# Create your views here.
class RegularAPIViewSet(viewsets.ModelViewSet):
""" The functionallity of this class allows the user to register
themeselves as a regular based user in our system """
queryset = RegularUser.objects.all()
serializer_class = ProfileSerializer
filter_backends = (filters.SearchFilter,)
search_fields = ('name', 'email', 'phone_number')
def create(self, request):
""" This validates and saves the registered regular user
in the database. """
serializer = ProfileSerializer(data=request.data)
queryset = RegularUser.objects.all()
if serializer.is_valid():
serializer.save()
id = serializer.data.get('id')
name = serializer.data.get('name')
last_name = serializer.data.get('last_name')
message = "Hellow ID:{}, {} {}".format(id, name, last_name)
return Response({'message':message})
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
在serializer.valid之后的模型中,您现在需要用户admin\u user\u.save()。为什么?我想应该是serializer.save()而不是admin\u user\u now.save()谢谢你在中写:)我忘了删除那一行,我正在尝试另一种方法,但仍然不起作用。虽然假定它是序列化程序.save()
,但这一点您是正确的。