Как у меня есть sh пароли в DRF? - PullRequest
0 голосов
/ 06 апреля 2020

У меня проблема с сериализованными данными, которые Django REST Framework выводит, потому что поля пароля не хэшированы (особенно те, которые созданы непосредственно из DRF). Пользователь, которого я создал с помощью команды createuperuser, имеет сериализованный хэшированный пароль (pbkdf2), что хорошо, но те, которые я создаю с помощью DRF, - нет. Сериализатор, который я использую, выглядит следующим образом (serializers.py):

from users.models import User

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(style={'input_type': 'password'})
    class Meta:
        model = User
        fields = '__all__'

Класс модели выглядит следующим образом (models.py):

from django.contrib.auth.models import AbstractUser

# Create your models here.

class User(AbstractUser):
    class Role:
        ADMINISTRATOR = 'Administrator'
        PHARMACIST = 'Pharmacist'
        PATIENT = 'Patient'

        choices = {
            (ADMINISTRATOR, 'Administrator'),
            (PHARMACIST, 'Pharmacist'),
            (PATIENT, 'Patient'),
        }

    role = models.CharField(max_length=100, choices=Role.choices, default=Role.ADMINISTRATOR)
    first_name = models.CharField(max_length=100, blank=False)
    last_name = models.CharField(max_length=100, blank=False)
    email = models.EmailField(max_length=100, unique=True)
    birth_date =  models.DateField(auto_now_add=False, blank=True, null=True)
    address = models.CharField(max_length=255)

И набор запросов выглядит следующим образом (views.py):

from django.shortcuts import render
from users.models import User
from rest_framework import viewsets
from users.serializers import UserSerializer

# Create your views here.


class UserViewSet(viewsets.ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()

Я с нетерпением жду вашей помощи.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Это сработало для меня:

def create(self, validated_data):
    user = super(UserSerializer, self).create(validated_data)
    user.set_password(validated_data['password'])
    user.save()
    return user

Теперь пароли сериализуются.

0 голосов
/ 06 апреля 2020

Вы можете переопределить .to_internal_value(). (Это имеет преимущество перед переопределением create() сохранения объекта только один раз.)

Это может быть странным при редактировании пользователя. YMMV:)

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(style={'input_type': 'password'})

    class Meta:
        model = User
        fields = '__all__'

    def to_internal_value(self, validated_data):
        raw_password = validated_data.pop('password')
        user = super().to_internal_value(validated_data)
        user.set_password(raw_password)  # Hash the raw password
        return user
...