如何解决DRF auth_token "non_field_errors": [ "无法使用提供的凭据登录" ] 使用自定义用户模型
我正在尝试使用现有数据库创建一个 rest api。我也在使用 drf 令牌身份验证并为所有现有用户创建了令牌。当我尝试输入我的用户名和密码以从我的获取验证令牌视图中获取我的令牌时,我收到以下错误:
"non_field_errors": [
"Unable to log in with provided credentials."
]
我的代码如下:
视图.py
from django.shortcuts import render
from django.db import connection
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import viewsets
from rest_framework.authentication import TokenAuthentication
from rest_framework import filters
from rest_framework import generics
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.settings import api_settings
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework.permissions import IsAuthenticated
from rest_framework.renderers import JSONRenderer
from api import serializers
from api import models
from itertools import chain
# Create your views here.
class UserLoginApiView(ObtainAuthToken):
"""Handle creating user authentication tokens"""
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
urls.py
from django.urls import path,include
from rest_framework.routers import DefaultRouter,SimpleRouter
from api import views
urlpatterns = [
path('login',views.UserLoginApiView.as_view()),]
models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.models import BaseUserManager,UserManager
from django.conf import settings
from django.dispatch import receiver
from django.urls import reverse
class UserProfileManager(BaseUserManager):
def create_user(self,email,username,password=None):
if not email:
raise ValueError('User must have an email address')
email = self.normalize_email(email)
user = self.model(email=email,username=username)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self,password):
user = self.create_user(email,password)
user.is_superuser = True
user.is_staff = True
user.save(using=self._db)
return user
def myoverridenmeta(name,bases,adict):
newClass = type(name,adict)
for field in newClass._meta.fields:
if field.attname == 'last_login':
field.column = 'lastLogin'
field.db_column = 'lastLogin'
return newClass
class InvshellUsers(AbstractBaseUser,PermissionsMixin):
id = models.AutoField(db_column='userID',primary_key=True) # Field name made lowercase.
username = models.CharField(max_length=20,unique=True)
password = models.CharField(max_length=50)
first_name = models.CharField(db_column='firstName',max_length=50,blank=True,null=True) # Field name made lowercase.
lastname = models.CharField(db_column='lastName',null=True) # Field name made lowercase.
email = models.CharField(max_length=50,unique = True,null=True)
orgid = models.IntegerField(db_column='orgID',null=True) # Field name made lowercase.
territoryid = models.IntegerField(db_column='territoryID',null=True) # Field name made lowercase.
locationid = models.IntegerField(db_column='locationID',null=True) # Field name made lowercase.
role = models.CharField(max_length=15,null=True)
status = models.CharField(max_length=15,null=True)
timezone = models.CharField(max_length=50,null=True)
last_login = models.DateTimeField(db_column='lastLogin',null=True) # Field name made lowercase.
loginattempts = models.IntegerField(db_column='loginAttempts',null=True) # Field name made lowercase.
passchangedate = models.DateTimeField(db_column='passChangeDate',null=True) # Field name made lowercase.
activatedate = models.DateTimeField(db_column='activateDate',null=True) # Field name made lowercase.
addedby = models.CharField(db_column='addedBy',null=True) # Field name made lowercase.
uom = models.IntegerField(blank=True,null=True)
uomtemp = models.IntegerField(db_column='uomTemp',null=True) # Field name made lowercase.
objects = UserProfileManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
def get_short_name(self):
return self.username
def __str__(self):
return self.email
__metaclass__ = myoverridenmeta
class Meta:
managed = True
db_table = 'invShell_users'
来自 settings.py 的相关信息
INSTALLED_APPS = [
'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','rest_framework','rest_framework.authtoken','push_notifications',#'django_celery_beat','api',]
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',],}
AUTH_USER_MODEL='api.InvshellUsers'
非常感谢您帮助解决此错误
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。