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

原创 184阅读 · 时间2019年6月4日 18:16

扩展django-user表

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

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

我的app名称是users.


from django.db import models
# 引入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登录验证和注册方式

转载请注明原文地址。


评论

本站升级中... 如有好的建议请加入QQ群!

相关文章推荐 ?
近七日热文推荐 !
回到顶部