今天使用django自带的用户系统,进行jwt,重写了user模型,使用手机登录,于是就想用django自带的登录验证...
哎,一切折腾都在于不熟悉
如果想看如何重写自带的user模型,我下次再写篇文章吧,先挖个坑
好了,重写自带的登录验证,就跟别人不一样,由此我发现了django强迫症一处,按所有教程,django能增加除了用户名之前的登录的前提是字段统一,也就是说...
正常是username字段,post的表单得有username字段,而增加手机登录或者邮箱登录,字段还得是username...这一处十分恶心..
因为我重写了User模型,所以绑定的是手机号码字段,那我又想增加用户名的验证了,于是就有这样的代码
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from user.models import User
class UserBackend(ModelBackend):
def authenticate(self,username=None, password=None, **kwargs):
try:
user = User.objects.get(Q(telephone=username) | Q(username=username))
except User.DoesNotExist: # 可以捕获除与程序退出sys.exit()相关之外的所有异常
return None
if user.check_password(password):
return user
def get_user(self, user_id):
try:
return User.objects.get(id=user_id)
except User.DoesNotExist:
return None
调用成功,但真的难受的一逼..
于是我兴高采烈的去尝试,我发现....
只有login函数才能触发用户last_login的刷新,而login又基于session,除了后台我用到了,其他我用了jwt,鬼tm的...刷新用户登录时间
经过一番思考,我终于决定放弃自带验证,还不如自己手动写验证,这样...我还能让字段舒服一些。
我写了这么多,就是以防有人跟我一样走了这条路,浪费更多的时间...
尽管如此,我还是认识了Q的写法...