簡體   English   中英

如何使用Django REST Framework(DRF)3創建django用戶

[英]How to create a django User with Django REST Framework (DRF) 3

我正在嘗試使用Django Rest Framework 3.1.1在POST中創建用戶。 我需要使用內置方法來創建加密密碼,因此我嘗試覆蓋ModelSerializer上的save方法,但是我顯然不十分了解Django / DRF。 有沒有簡單的方法可以做到這一點?

當我嘗試下面的代碼時,出現錯誤:

unbound method set_password() must be called with User instance as first argument (got unicode instance

代替)

from django.contrib.auth.models import User

from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

    def save(self):
        email = self.validated_data['email']
        username = self.validated_data['username']
        password = User.set_password(self.validated_data['password'])

嘗試做這樣的事情:

class UserSerializer(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

由於您正在使用ModelSerializer ,因此可以在視圖中覆蓋perform_create()函數,然后為用戶設置密碼。

DRF提供了此掛鈎,以添加一些自定義操作,這些操作應在保存對象之前或之后進行。

根據DRF3文檔:

這些替代點對於添加在保存對象之前或之后發生的行為(例如通過電子郵件發送確認或記錄更新)特別有用。

from django.contrib.auth.hashers import make_password

class MyView(..):

    ...

    def perform_create(self, serializer):
        hashed_password = make_password(serializer.validated_data['password']) # get the hashed password
        serializer.validated_data['password'] = hashed_password 
        user = super(MyView, self).perform_create(serializer) # create a user

由於Django以散列格式而不是原始密碼存儲密碼,因此我們使用Django的make_password()獲取散列格式的原始密碼。 然后,我們將序列化程序的validated_data中的password設置為此哈希密碼。 然后,在通過調用super()創建用戶時,序列化程序將使用此哈希密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM