python - 保存更新期间密码未加密
问题描述
我正在尝试使用api
. 根据我的post/put
要求,我的密码不会以加密形式保存。我的代码如下。
视图.py
from urllib import request
from rest_framework import viewsets, status
from django.contrib.auth.models import User
from atest.serializers import UserSerializer
from rest_framework import permissions
from atest.permissions import IsOwnerOrReadOnly
from rest_framework.decorators import action
from rest_framework.response import Response
class UserViewSet(viewsets.ModelViewSet):
"""
This viewset provides operations on Users table to the same user.
"""
# permission_classes = [IsOwnerOrReadOnly,]
queryset = User.objects.all()
serializer_class = UserSerializer
序列化程序.py
from rest_framework import serializers
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password
class UserSerializer(serializers.HyperlinkedModelSerializer):
password = serializers.CharField(max_length=128, style={'input_type': 'password'}, write_only=True)
class Meta:
model = User
fields = ('url', 'id', 'username', 'email', 'first_name', 'last_name', 'password')
def create(self, validated_data):
username = validated_data['username']
email = validated_data['email']
first_name = validated_data['first_name']
last_name = validated_data['last_name']
password = make_password(validated_data['password'])
def update(self, instance, validated_data):
instance.email = validated_data.get('email', instance.email)
instance.username = validated_data.get('username', instance.username)
instance.first_name = validated_data.get('first_name', instance.first_name)
instance.last_name = validated_data.get('last_name', instance.last_name)
instance.password = make_password(validated_data.get('password', instance.password))
instance.save()
return instance
请帮我确定解决方案。我的密码没有被加密,我做错了什么?
解决方案
您只是将事物分配给create
;中的局部变量 此外,您不应该make_password
使用; 这样,您将在实例中重新散列散列密码,使其无法使用。update
instance.password
在 DRF 文档中恰好有一个示例(略微迂回),可能会对您有所帮助:
class CreateUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('email', 'username', 'password')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(
email=validated_data['email'],
username=validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
return user
推荐阅读
- sql - 如何在 sql 中生成非常大的数组
- cassandra - 如何更改 cassandra.yaml 文件并重启 cassandra 集群?
- c++ - 当头文件的文件夹位于同一目录中时检测到包含错误?
- angular - 找不到构建器 @angular-devkit/build-angular:dev-server 的实现
- google-app-engine - 如何在 Google NLP 情感分析中正确训练模型
- javascript - 使用组件内的选择器将主题/样式应用于所有 html/react 标签
- powershell - ConvertFrom-String 返回符号而不是文本
- javascript - 如何在 Angular ace 编辑器中根据特定场景启用和禁用默认代码段关键字
- python - 使用 python 电子邮件库解析原始电子邮件添加不需要的字符
- python - 如何在不指定 excel 名称的情况下从文件夹中读取 excel?