前言
别想了,基础不扎实的话,还是老老实实用django自带的用户模块吧!这是一次耗时而且失败了的经历。
因为是一次失败的经历,这里我给出一些残酷的经验。
实操
重写用户模型
这是我唯一成功的案例,你需要建一个类似如下的django-orm模型
mysql_models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManagerclass TpUserManager(BaseUserManager):def create_user(self, username, password=None, **extra_fields):if not username:raise ValueError('The Username field must be set')user = self.model(username=username, **extra_fields)user.set_password(password)user.save(using=self._db)return userdef create_superuser(self, username, password=None, **extra_fields):extra_fields.setdefault('is_staff', True)extra_fields.setdefault('is_superuser', True)return self.create_user(username, password, **extra_fields)def authenticate(self, request, username=None, password=None):try:user = self.model.objects.get(username=username)if user.check_password(password) and user.state == 1 and user.user_type == 1:return userexcept self.model.DoesNotExist:return Noneclass TpUser(AbstractBaseUser):user_id = models.AutoField(primary_key=True, db_comment='自增id')user_type = models.IntegerField(blank=True, null=True, db_comment='用户类型,0为服务商,1为客户')username = models.CharField(unique=True, max_length=255, blank=True, null=True, db_comment='用户名')email = models.CharField(max_length=255, blank=True, null=True, db_comment='邮箱')is_active = models.IntegerField(blank=True, null=True, db_comment='是否')last_login = models.DateTimeField(blank=True, null=True, db_comment='上次登入时间')secret = models.CharField(max_length=255, blank=True, null=True, db_comment='授权码')password = models.CharField(max_length=255, blank=True, null=True, db_comment='密码')account_id = models.CharField(max_length=255, blank=True, null=True, db_comment='账户编码')create_time = models.DateTimeField(blank=True, null=True, db_comment='创建时间')state = models.IntegerField(blank=True, null=True, db_comment='当前状态,0为未启用,1为正常使用,2为封禁')objects = TpUserManager() # 可能需要自定义用户管理器USERNAME_FIELD = 'username'REQUIRED_FIELDS = ['email']class Meta:managed = Falsedb_table = 'tp_user'
同目录__init__.py
from .mysql_models import TpUser
setting.py
INSTALLED_APPS = [...'youproject',...
]AUTH_USER_MODEL = 'youproject.TpUser'
遗憾点
authenticate和login均没有生效
按理来讲,我继承了django原生auth的功能,但实际上两个方法都绕过了我改写的数据表,不知道最终调用了哪里的数据,导致登入功能完全无效。
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth import authenticate, logindef user_input_check(username, password):message = ''if len(username) > 16:message = "用户名不得超过16位!"elif len(password) < 6:message = "密码不得少于6位!"elif len(password) > 16:message = "密码不得超过16位!"if message:return False, messageelse:return True, ''def login_view(request):if request.method == 'POST':username = request.POST['username']password = request.POST['password']print(username, password)ret, msg = user_input_check(username, password)if ret:user = authenticate(request, username=username, password=password)if user:login(request, user)return redirect('/welcome') # 替换 'welcome' 为你应用的主页视图名else:messages.error(request, "用户名或密码错误!")else:messages.error(request, msg)return render(request, 'user/login.html')
为此,我十分头疼,并花费了若干小时去解决,但最终决定放弃,转而采用触发器或者主动脚本的方式来实现自写数据表和django默认auth表的交互,进而实现django用户管理。