今天使用 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

Image

调用成功,但真的难受的一逼..

于是我兴高采烈的去尝试,我发现....

只有 login 函数才能触发用户 last_login 的刷新,而 login 又基于 session,除了后台我用到了,其他我用了 jwt,鬼 tm 的...刷新用户登录时间

经过一番思考,我终于决定放弃自带验证,还不如自己手动写验证,这样...我还能让字段舒服一些。

我写了这么多,就是以防有人跟我一样走了这条路,浪费更多的时间...

尽管如此,我还是认识了 Q 的写法...