djangorestframework-simplejwt 得到 "No active account found with the given credentials" 虽然我知道我的用户存在
djangorestframework-simplejwt getting "No active account found with the given credentials" although I know my user exists
我对 Django 还很陌生,觉得我一定遗漏了一些东西。我有一个需要两种用户类型(UserType1 和 UserType2)的应用程序。我正在使用带有布尔标志的基本用户模型,然后在这些对象上为用户创建 OneToOne 字段(此时没有添加额外的数据)。
这为我提供了以下用户模型:
from django.conf import settings
from django.contrib.auth.models import AbstractUser, UserManager
from django.core.exceptions import ValidationError
from django.db import models
from django_extensions.db.models import TimeStampedModel
class User(AbstractUser):
"""
Default user model for the platform
"""
email = models.EmailField()
is_user_type_1 = models.BooleanField(default=False)
is_user_type_2 = models.BooleanField(default=False)
# Use default UserManager for now
objects = UserManager()
class UserType1(TimeStampedModel):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
primary_key=True,
related_name='user_type1',
)
class UserType2(TimeStampedModel):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
primary_key=True,
related_name='user_type2'
)
然后我为这些 类 编写了序列化,我只想公开和终结 UserType1
和 UserType2
(而不是 User
本身)。这应该允许用户创建 UserType1
或 UserType2
的实例,这也将在 User
table 中创建行(尽管对此可能不是特别重要)。以下是序列化程序:
from django.db import transaction
from rest_framework import serializers
from .models import User, UserType1, UserType2
class UserSerializer(serializers.ModelSerializer):
"""
Serializer for the `User` model
"""
class Meta:
model = User
fields = (
'username',
'email',
'password',
'first_name',
'last_name',
'is_active',
)
extra_kwargs = {'password': {'write_only': True}}
class UserType1Serializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
class Meta:
model = UserType1
fields = (
'user',
'created',
'modified',
)
@transaction.atomic
def create(self, validated_data):
user_data = validated_data.pop('user')
user_data.is_user_type_1 = True
user_data.is_user_type_2 = False
user = UserSerializer.create(UserSerializer(), validated_data=user_data)
user_type_1, created = UserType1.objects.update_or_create(
user=user,
)
return user_type_1
class UserType2Serializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
class Meta:
model = UserType2
fields = (
'user',
'created',
'modified',
)
@transaction.atomic
def create(self, validated_data):
user_data = validated_data.pop('user')
user_data.is_user_type_1 = False
user_data.is_user_type_2 = True
user = UserSerializer.create(UserSerializer(), validated_data=user_data)
user_type2, created = UserType2.objects.update_or_create(
user=user,
)
return user_type2
User
模型已在我的设置中注册:
AUTH_USER_MODEL = 'user.User'
创建超级用户后,我可以成功获取令牌并使用它们访问其他视图:
{
"refresh": "xxxx",
"access": "xxxx"
}
但是,如果我从管理员创建一个用户(或者我有创建用户和 user_type1/user_type2 对象的固定装置),每次我尝试获取我得到的令牌时:
{
"detail": "No active account found with the given credentials"
}
但我知道它们存在于数据库中,因为我可以在管理控制台中正确地看到它们。我认为这与密码散列有关,但无法解决。
这还包含以下 admin.py
文件:
from django.contrib import admin
from .models import User, UserType1, UserType2
admin.site.register(User)
admin.site.register(UserType1)
admin.site.register(UserType2)
任何帮助将不胜感激!!
在管理员中注册您的自定义用户模型:
from django.contrib.auth.admin import UserAdmin
admin.site.register(models.User, UserAdmin)
或者按照有关如何在管理员中注册自定义用户模型的文档进行操作。
A full example
通过管理面板创建一个新用户并检查密码是否经过哈希处理。
然后再次 api 调用您的 jwt 端点。
我对 Django 还很陌生,觉得我一定遗漏了一些东西。我有一个需要两种用户类型(UserType1 和 UserType2)的应用程序。我正在使用带有布尔标志的基本用户模型,然后在这些对象上为用户创建 OneToOne 字段(此时没有添加额外的数据)。
这为我提供了以下用户模型:
from django.conf import settings
from django.contrib.auth.models import AbstractUser, UserManager
from django.core.exceptions import ValidationError
from django.db import models
from django_extensions.db.models import TimeStampedModel
class User(AbstractUser):
"""
Default user model for the platform
"""
email = models.EmailField()
is_user_type_1 = models.BooleanField(default=False)
is_user_type_2 = models.BooleanField(default=False)
# Use default UserManager for now
objects = UserManager()
class UserType1(TimeStampedModel):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
primary_key=True,
related_name='user_type1',
)
class UserType2(TimeStampedModel):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
primary_key=True,
related_name='user_type2'
)
然后我为这些 类 编写了序列化,我只想公开和终结 UserType1
和 UserType2
(而不是 User
本身)。这应该允许用户创建 UserType1
或 UserType2
的实例,这也将在 User
table 中创建行(尽管对此可能不是特别重要)。以下是序列化程序:
from django.db import transaction
from rest_framework import serializers
from .models import User, UserType1, UserType2
class UserSerializer(serializers.ModelSerializer):
"""
Serializer for the `User` model
"""
class Meta:
model = User
fields = (
'username',
'email',
'password',
'first_name',
'last_name',
'is_active',
)
extra_kwargs = {'password': {'write_only': True}}
class UserType1Serializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
class Meta:
model = UserType1
fields = (
'user',
'created',
'modified',
)
@transaction.atomic
def create(self, validated_data):
user_data = validated_data.pop('user')
user_data.is_user_type_1 = True
user_data.is_user_type_2 = False
user = UserSerializer.create(UserSerializer(), validated_data=user_data)
user_type_1, created = UserType1.objects.update_or_create(
user=user,
)
return user_type_1
class UserType2Serializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
class Meta:
model = UserType2
fields = (
'user',
'created',
'modified',
)
@transaction.atomic
def create(self, validated_data):
user_data = validated_data.pop('user')
user_data.is_user_type_1 = False
user_data.is_user_type_2 = True
user = UserSerializer.create(UserSerializer(), validated_data=user_data)
user_type2, created = UserType2.objects.update_or_create(
user=user,
)
return user_type2
User
模型已在我的设置中注册:
AUTH_USER_MODEL = 'user.User'
创建超级用户后,我可以成功获取令牌并使用它们访问其他视图:
{
"refresh": "xxxx",
"access": "xxxx"
}
但是,如果我从管理员创建一个用户(或者我有创建用户和 user_type1/user_type2 对象的固定装置),每次我尝试获取我得到的令牌时:
{
"detail": "No active account found with the given credentials"
}
但我知道它们存在于数据库中,因为我可以在管理控制台中正确地看到它们。我认为这与密码散列有关,但无法解决。
这还包含以下 admin.py
文件:
from django.contrib import admin
from .models import User, UserType1, UserType2
admin.site.register(User)
admin.site.register(UserType1)
admin.site.register(UserType2)
任何帮助将不胜感激!!
在管理员中注册您的自定义用户模型:
from django.contrib.auth.admin import UserAdmin
admin.site.register(models.User, UserAdmin)
或者按照有关如何在管理员中注册自定义用户模型的文档进行操作。 A full example
通过管理面板创建一个新用户并检查密码是否经过哈希处理。 然后再次 api 调用您的 jwt 端点。