DRF auth_token "non_field_errors": [ "无法使用提供的凭据登录。" ] 使用自定义用户模型

时间:2021-01-13 16:18:56

标签: python-3.x django django-models django-rest-framework django-users

我正在尝试使用现有数据库创建一个 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, email, username, password):
       
        user = self.create_user(email, username, password)

        user.is_superuser = True
        user.is_staff = True
        user.save(using=self._db)

        return user


def myoverridenmeta(name, bases, adict):
    newClass = type(name, bases, 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', max_length=50, blank=True, null=True)  # Field name made lowercase.
    email = models.CharField(max_length=50, blank=True, unique = True, null=True)
    orgid = models.IntegerField(db_column='orgID', blank=True, null=True)  # Field name made lowercase.
    territoryid = models.IntegerField(db_column='territoryID', blank=True, null=True)  # Field name made lowercase.
    locationid = models.IntegerField(db_column='locationID', blank=True, null=True)  # Field name made lowercase.
    role = models.CharField(max_length=15, blank=True, null=True)
    status = models.CharField(max_length=15, blank=True, null=True)
    timezone = models.CharField(max_length=50, blank=True, null=True)
    last_login = models.DateTimeField(db_column='lastLogin', blank=True, null=True)  # Field name made lowercase.
    loginattempts = models.IntegerField(db_column='loginAttempts', blank=True, null=True)  # Field name made lowercase.
    passchangedate = models.DateTimeField(db_column='passChangeDate', blank=True, null=True)  # Field name made lowercase.
    activatedate = models.DateTimeField(db_column='activateDate', blank=True, null=True)  # Field name made lowercase.
    addedby = models.CharField(db_column='addedBy', max_length=50, blank=True, null=True)  # Field name made lowercase.
    uom = models.IntegerField(blank=True, null=True)
    uomtemp = models.IntegerField(db_column='uomTemp', blank=True, 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'

非常感谢您帮助解决此错误

0 个答案:

没有答案