郑统京 发表于 2022-11-5 19:42:04

Django之auth模块

# Auth模块简介
其实我们在创建好一个django项目时候执行迁移命令会自动执行很多表
    django_session
    auth_user
django在启动之后就可以访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表
并且还必须是管理员用户才能进入
[创建超级用户(管理员)]
1、python manage.py createsuperuser
2、一般用tools工具manage执行createsuperuser
[后端代码]
注册用户名和密码
from django.contrib.auth.models import User
def register(request):
    if request.method == 'POST':
      username = request.POST.get('username')
      password = request.POST.get('password')
      # 操作auth_user表写入数据
      # User.objects.create(username=username,password=password) # 这种写入数据密码不是加密,后面通过auth是比对密码会报错的
      # 创建普通用户
      # User.objects.create_user(username=username,password=password)
      # 创建超级用户(一般不会暴露给用户)
      User.objects.create_superuser(username=username,email='123@qq.com',password=password)# 使用代码创建的超级用户邮箱是必填的
    return render(request,'register.html')

登录校验账户密码、保存用户状态
from django.contrib import auth
def login(request):
    if request.method == 'POST':
      username=request.POST.get('username')
      password=request.POST.get('password')
      # 去用户表中校验数据
      # 1、表如何获取
      # 2、密码如何比对
      user_obj = auth.authenticate(request,username=username,password=password)
      # print(user_obj)# 用户对象 里面定义一个双下str方法 zheng数据不符合则返回None
      # print(user_obj.username)# 用户名 zheng
      # print(user_obj.password)# 用户密码 pbkdf2_sha256$36000$fOsEpX97UZwU$HssyGIDaJIgto6jg73i2tW6E3gJqija4QIJHeWvzfqs
      # 判断用户是否存在
      if user_obj:
            # 保存用户状态
            auth.login(request,user_obj) # 类似与request.session = user_obj
            # 虽然自己也可以自己保存session但事实我们使用auth模块要用就用全套

            # 只要执行了这个方法,就可以在任何地方通过request.user获取到当前登录的用户对象
            return redirect('/home/')
      """
      1、自动查找auth_user表
      
      2、自动给密码加密比对
      该方法的注意事项:
            括号内必须同时传入用户名和密码
            不能只传入用户名(一步就帮你筛选出用户加对象)
      """
    return render(request,'login.html')
校验用户是否登录、装饰器
from django.contrib.auth.decorators import login_required
# @login_required(login_url='/login/') # 局部配置:用户没有登录跳转到login_user指定网址
# @login_required # 全局配置 在settings中 LOGIN_URL = '/login/'
# @login_required(login_url='/xxx/') # 优先级局部>全局
@login_required# 全局配置
def home(request):
    """登录之后才能看home"""
    # 自动去django_session里面查找对应的用户对象给你封装到request.user中
    print(request.user) # 用户对象AnonymousUser 匿名用户
    # 判断用户是否登录
    print(request.user.is_authenticated())
    return HttpResponse('ok')

"""
1、如果局部和全局都有 该听谁的呢?
    局部>全局
2、全局和局部哪个好呢?
    全局的好处无需重复写代码,但是跳转的页面比较单一
    局部的好处不同的视图在用户没有登录下可以自定义跳转不同的页面"""
单独校验密码、修改密码、保存数据库
@login_required
def set_password(request):
    if request.method =='POST':
      # username = request.POST.get('username')
      old_password = request.POST.get('old_password')
      new_password = request.POST.get('new_password')
      confirm_password = request.POST.get('confirm_password')
      # 先校验两次密码是否一致
      ifnew_password == confirm_password:
            # 校验老密码是否一致源码返回的is一般都是布尔值
            # 密码在数据库是密文的,我们学的auth校验数据的方式只有一种authenticated一种,而且还是必须要上传username和password同时的
            is_right = request.user.check_password(old_password) # 自动加密再去校验
            # 修改密码
            if is_right:
                request.user.set_password(new_password) # 相当于是事务的提交
                request.user.save() # 这一步才是操作数据库
                return redirect('/login/')
            return HttpResponse('原密码错误')
      return HttpResponse('两次密码不一致')
    return render(request,'set_password.html',locals())
auth方法总结
、比对用户名和密码是否正确]
去用户表中校验数据
1、表如何获取
2、密码如何比对
user_obj = auth.authenticate(request,username=username,password=password)[括号内必须同时传入账号和密码]
print(user_obj)# 用户对象 里面定义一个双下str方法 zheng数据不符合则返回None
print(user_obj.username)# 用户名 zheng
print(user_obj.password)# 用户密码 pbkdf2_sha256$36000$fOsEpX97UZwU$HssyGIDaJIgto6jg73i2tW6E3gJqija4QIJHeWvzfqs
      # 判断用户是否存在
      if user_obj:
、保存用户状态]
auth.login(request,user_obj) # 类似与request.session = user_obj
只要执行了这个方法,就可以在任何地方通过获取到当前登录的用户对象]
return redirect('/home/')

、判断当前用户是否登录]
request.user.is_authenticated() #返回布尔值

、获取当前登录用户]
request.user
1、存在就是登录用户
2、不存在即使匿名用户

、校验用户是否登录装饰器]
    from django.contrib.auth.decorators import login_required
    [局部配置]
    @login_required(login_url='/login/')
    [全局配置settings中
    LOGIN_URL='/LOGIN/'
    1、如果局部和全局都有 该听谁的呢?
      局部>全局
    2、全局和局部哪个好呢?
      全局的好处无需重复写代码
      局部的好处不同的视图在用户没有登录下可以跳转不同的页面

、比对原密码]
request.user.check_password(old_password)

、修改密码]
request.user.set_password(new_password) 仅仅是修改
request.user.save()

、注销密码]
auth.logout(request)

、注册]
    1、不是加密,后面通过auth是比对密码会报错的
    User.objects.create(username=username,password=password)
    2、创建普通用户
    User.objects.create_user(username=username,password=password)
    3、创建超级用户,邮箱必填
    User.objects.create_superuser(username=username,email='123@qq.com',password=password)
自定义auth_user表及拓展字段
# 如何扩展auth_user表
from django.contrib.auth.models import User,AbstractUser
但是要注意,User被替换了,那么就意味着你不用导入django表了,直接使用from app01 import models 然后models.Userinfo
[第一种通过外键字段,可以把两个表合成一个表增加字段,但是不推荐,太麻烦]
class UserDetail(models.Model):
    phone = models.BigIntegerField()
    user= models.OneToOneField(to='User')

[第二种:通过面向对象的继承]
class UserInfo(AbstractUser):
    phone=models.BigIntegerField()
    create_time = models.DateTimeField(auto_now_add=True)
如果没有继承了AbstractUser
那么在执行数据库迁移的时候auth_user表会被UserInfo表顶替掉,不会再创建出来了
并且UserInfo里面结成了auth_user中所有字段,并且还可以自定义去拓展字段
前提:
    、在继承之前不能执行迁移命令,就是auth_user表没有被创建出来,如果创建出来]
就只能重新换一个库
    、继承的类里面不要覆盖Abstract里面的字段名,不要和以前的字段重复
      表里面的字段不要动,有其他功能绑定了
    、需要在配置文件中告诉django你要用UserInfo替代auth_user]
      AUTH_USER_MODEL = 'app01.UserInfo'
                            '应用名.表名'
、非常重要]
需要在配置文件中告诉django你要用UserInfo替代auth_user
    AUTH_USER_MODEL = 'app01.UserInfo'
                        '应用名.表名'

郑统京 发表于 2022-11-5 19:57:57

[如何创建超级用户/管理员]
python manage.py createsuperuser
from django.contrib import auth

auth.authenticate(request,username=username,password=password)
注意用户名和密码都需要给否则报错,该方法有一个返回值,用户对象/None

auth.login(request,user_obj)
内部自动操作session表,把request.session=user_obj
该方法执行完毕,可以在任意位置可以通过request.user获得到当前用户对象

request.user.is_authenticated()
返回的是布尔值

from django.contrib.auth.decorators import login_required
    -
      @login_required(login_url='/login/')
    -   
      settings中写入LOGIN_URL='/login/'
    -[优先级]
      局部>全局
    -[各个好处]
      局部扩展性强(自定义url跳转为位置)
      全局代码简化

request.user.check_password(old_password)

request.user.set_password(new_password)
request.user.save()

from django.contrib.auth.models import User
    1、User.objects.create()密码不加密、不用
    2、User.objects.create_user()创建普通用户
    3、User.objects.create_superuser() 创建超级用户 该方法邮箱必填,命令行创建邮箱可以不填
页: [1]
查看完整版本: Django之auth模块