美文网首页
扩展django-User表,修改(自定义)django登录验证

扩展django-User表,修改(自定义)django登录验证

作者: 慢半帧 | 来源:发表于2019-06-05 23:19 被阅读0次

    扩展django-user表

    django默认的字段对于我们的需求往往不够用,我们需要添加自己需要的字段。还有就是扩展django-user表的话还是可以用request.user来获取到当前用户信息

    在我们的app下的models.py文件中键入如下代码来扩展django自带的User表:

    我的app名称是users.

    # 引入django自带User表(占坑), 以便于在下方继承
    from django.contrib.auth.models import AbstractUser
    
    # 继承 AbstractUser
    class UserExtension(AbstractUser):
        #  在下方添加所扩展的字段
        phone = models.CharField(max_length=11, blank=True, null=True, verbose_name="手机号码") 
    

    然后在setting.py中加入:

    # 'users.UserExtension' 是 ‘app名称.刚才扩展字段的类名’
    AUTH_USER_MODEL = 'users.UserExtension' 
    

    这时你再进行同步数据库。可能会出错,出错的话建议百度活联系我。

    这时看我们数据库里的表是这样的,你可以对照原生的django表对比一下。

    image.png

    修改django登录的验证

    我们在用django做登录验证的时候默认是需要username字段和password字段,现在我们想让他用手机号+密码 或者 邮箱+密码该怎么实现登录验证呢?

    默认登录验证代码:

    from django.views import View
    from django.shortcuts import render, redirect
    from django.contrib.auth import authenticate, login
    
    def login(request):
        username = 123
        password = 123
    
        user = authenticate(username=username, password=password)  #用户验证
        if user:
            login(request, user)  #用户登录
            return redirect('/')
         else:
            return render(request, "users/login/") 
    

    从上述代码可以看到django登陆主要是基于authenticate,如果我们想要使用手机号码/邮箱来代替,那么可以重写authenticate();

    重写authenticate:

    from django.contrib.auth.backends import ModelBackend
    from django.db.models import Q
    from .models import UserExtension
    
    class CustomBackend(ModelBackend):
        def authenticate(self, request, username=None, password=None, **kwargs):
            try:
                user = UserExtension.objects.get(Q(username=username) | Q(phone=username))
                if user.check_password(password):
                    return user
            except Exception as e:
                return None 
    

    然后在setting.py中设置如下:

    我的app名称是:users ;重写类名为CustomBackend; 所以是‘users.views.CustomBackend’

    AUTHENTICATION_BACKENDS =('users.views.CustomBackend',) 
    

    重写完之后我们再进行登录验证的时候就可以这样进行操作了:

    重写后的验证方式:

    def user_login(request):
        phone = request.POST['phone']
        password = request.POST['password']
    
       # 实例化刚才重写的类
       authentication = CustomBackend()
       user = authentication.authenticate(request, username=phone, password=password)
       if user:
           return HttpResponse("恭喜登录成功")
       else:
           return HttpResponse("登录失败") 
    

    第二次更新:扩展django_user表后的自定义注册

    修改django注册方式

    因为我们对django_user表进行了扩展,我们还可以继续用django自带的create_user方法来完成注册;

    既然我们都扩展了字段,我们不妨来试试自己定义一下django的注册方式;

    还有一点原因就是用django--create_user注册账号的时候至少需要 username,email,password字段(可能不需要email字段记不清了);

    假设我们现在的需求是用户名+手机号+验证码方式注册和登陆,我们该怎么实现呢?

    1.扩展django-user 表;

    2.修改注册方法

    3.修改登陆验证方法

    1和2在上文已经提到了,我们来看看 2,修改注册方法:

    1.大家都知道,django 自带的注册方法会给密码进行一定的加密处理,后期修改密码和登陆验证都需要

    2.扩展后的表可以算是一张自定义的新表,同样他还有User表的功能。

    请看代码:

    def zhuce(request):
        # 接收到传值
        password = 123
        # 像普通表一样存储
        user = UserInfo(username='abc', phone=123)
        # 调用User自带的set_password方法对密码进行加密
        user.set_password(password)
        # 保存
        user.save()
        return HttpResponse('ok') 
    

    这时候的注册和django自带的UserInfo.objects.creat_user() 结果是一样的,只不过我们写的方法会比较符合我们的需求,可以用自定义字段进行注册。


    新手写文,语句啰嗦,表述不清,还请多多谅解!!

    如有大佬觉得哪里不对,还请慷慨提建议!!!


    本文如有哪里不清楚或有其他问题,请联系:1441576268@qq.com 添加QQ请注明来意。

    本文初次发表于:python圈(Circle)

    原文链接:扩展django-User表,修改(自定义)django登录验证和注册方式

    转载请注明原文地址。

    相关文章

      网友评论

          本文标题:扩展django-User表,修改(自定义)django登录验证

          本文链接:https://www.haomeiwen.com/subject/cmuexctx.html