django2.1,Use mysql to custom login,MySQL: "Field 'id' doesn't have a default value"

77 views Asked by At

I try to custom login Django2.1 with Mysql,and I got this error: Field 'id' doesn't have a default value.But I had set ID in Aliuser is 'auto_increment' and 'not null': enter image description here

Where am I wrong?By the way, it is OK with sqlite3.So weird.

This is my models.py:

from __future__ import unicode_literals
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.contrib.auth.models import AbstractUser

@python_2_unicode_compatible
class AliUser(AbstractUser):
    userid = models.CharField(max_length=20, default='')  # user Id
    empid = models.CharField(max_length=100, default='')
    sso_token = models.CharField(max_length=36)  # SSO Token
    token_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.first_name

Here is my backends.py:

from django.contrib.auth.backends import RemoteUserBackend
from naxxramas.models import AliUser as User

class AliSSOUserBackend(RemoteUserBackend):
    def authenticate(self, request, userId, empId, first_name='', last_name='', email=''):
        if not userId or not empId:  # not my company user
            return None

        user = None

        try:
            user = User.objects.get(empid=empId)
            self.create_unknown_user = False
        except User.DoesNotExist:
            pass

        if self.create_unknown_user:
            user, created = User.objects.update_or_create(
                empid=empId, defaults={
                    'username': email.split('@', 1)[0],
                    'empid': empId,
                    'userid': userId,
                    'first_name': first_name or last_name or '', # first_name may be null
                    'last_name': last_name or '',
                    'email': email,
                })
            if created:
                user = self.configure_user(user)

        return user if self.user_can_authenticate(user) else None

And this is my views.py,i found it may wrong at "auth_login":

from django.conf import settings
from django.contrib.auth import authenticate, login as auth_login
from django.http import HttpResponseRedirect, HttpResponseBadRequest

def login(request):
    sso_token = request.GET.get('SSO_TOKEN')
    next = request.GET.get('BACK_URL')

    result = get_user_info_from_sso(sso_token)   # this is a method to get my staff login information
    if not result['hasError']:
        user = json.loads(result['content'])
        user_dict = normalize_user(user)
    else:
        return HttpResponseBadRequest('auth failed!')

    userId = user_dict.get('id')
    empId = user_dict.get('empId')
    email = user_dict.get('email')
    name = user_dict.get('name')
    realname = user_dict.get('realname')

    if userId is not None:
        user = authenticate(request, userId=userId, empId=empId, first_name=name, last_name=realname, email=email)
        auth_login(request, user)

    user.sso_token = user_dict.get('token')  # update user's token
    user.save()

    response = HttpResponseRedirect(next)
    return response
0

There are 0 answers