开始处理DRF
。我想使用 jwt token
对用户进行身份验证。但什么也没发生。我遇到了创建用户时出现的问题:{"user": {"email": ["此字段是必填的。"], "Username": ["此字段是必填的。 "], "Password": ["此字段是必填字段。"]}}。 尽管所有字段都已填写。
模型
class UserManager(BaseUserManager):
def create_user(self, username, email, password=None):
if username is None:
raise TypeError('Users must have a username.')
if email is None:
raise TypeError('Users must have an email address.')
user = self.model(username=username, email=self.normalize_email(email))
user.set_password(password)
user.save()
return user
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(db_index=True, max_length=255, unique=True)
email = models.EmailField(db_index=True, unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
bio = RichTextUploadingField(_('bio'), blank=True)
city = models.CharField(_('city'), max_length=100, blank=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = UserManager()
@property
def token(self):
return self._generate_jwt_token()
def _generate_jwt_token(self):
dt = datetime.now() + timedelta(days=60)
token = jwt.encode({
'id': self.pk,
'exp': int(dt.strftime('%s'))
}, settings.SECRET_KEY, algorithm='HS256')
return token.decode('utf-8')
序列化器
class RegistrationSerializer(serializers.ModelSerializer):
password = serializers.CharField(
max_length=128,
min_length=8,
write_only=True
)
token = serializers.CharField(max_length=255, read_only=True)
class Meta:
model = User
fields = ['email', 'username', 'password', 'token']
def create(self, validated_data):
return User.objects.create_user(**validated_data)
查看
class RegistrationAPIView(APIView):
permission_classes = (AllowAny,)
renderer_classes = (UserJSONRenderer,)
serializer_class = RegistrationSerializer
def post(self, request):
print('request.data: \t\t', request.data) #<QueryDict: {'{\n "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="780b190b190b190b380b190b190b560b0b190b" rel="noreferrer noopener nofollow">[email protected]</a>",\n "username": "sasasasas",\n "password": "12345678"\n}': ['']}>
print('request.data.get("user", {}): \t', request.data.get('user', {})) #{}
user = request.data.get('user', {})
serializer = self.serializer_class(data=user)
serializer.is_valid(raise_exception=True) #Error
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
最佳答案
我没有详细阅读本教程,但似乎由于某种原因,您发布到端点的有效负载应该与 DRF 通常期望的形状不同。
There is one thing we need to fix though. Notice how the response from the "Register" request has all of the user's information at the root level. Our client expects this information to be namespaced under "user." To do that, we'll need to create a custom DRF renderer.
所以不要发布这个:
{
"email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6e1b1d0b1c2e0b160f031e020b400d0103" rel="noreferrer noopener nofollow">[email protected]</a>",
"username": "user",
"password": "hunter2"
}
您必须将其全部嵌套在“user”键下。
{
"user": {
"email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6e1b1d0b1c2e0b160f031e020b400d0103" rel="noreferrer noopener nofollow">[email protected]</a>",
"username": "user",
"password": "hunter2"
}
}
关于django - "This field is required."DRF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57153716/