auth认证模块

  • auth认证模块

  • auth认证相关模块及操作

  • 扩展auth_user表

auth认证模块

django自带一个admin路由 但需要我们自己填写管理员账号和密码 如果想要使用admin后台管理 需要先创建表 然后创建管理员账号
直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表
    python39 manage.py makemigrations
    python39 manage.py migrate

# 创建超级管理员
     python39 manage.py createsuperuser

# 基于auth_user表编写用户相关的各项功能
      登录、校验用户是否登录、修改密码、注销登录等

auth认证相关模块及操作

# 导入auth模块
from django.contrib import auth
# 导入User表
from django.contrib.auth.models import User
  • 用户注册功能
# 查看表中是否已有该用户(包括管理员)(拿到的结果是一个queryset或None):
  res = User.objects.filter(username=username)
# 创建用户:(密码密文保存)
  User.objects.create_user(username=username,password=password)

    
    '''views.py'''    
def register_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        con_pwd = request.POST.get('con_pwd')
        if not password == con_pwd:
            return HttpResponse('两次密码不一致')
        # 1.校验用户名是否存在
        res = User.objects.filter(username=username)
        if res:
            return HttpResponse('用户名已存在')
        # 2.注册该用户
        # User.objects.create(username=username, password=password)  # create方法不行 密码不加密
        User.objects.create_user(username=username, password=password)  # create_user方法会自动对密码加密
    return render(request, 'registerPage.html')

image

  • 用户登陆功能
# 判断用户名和密码是否正确(用户名和密码正确了之后返回的是数据对象 不正确则返回none)
user_obj = auth.authenticate(request, username=username, password=password)
# 用户登陆成功(返回给客户端登陆的凭证、令牌、随机字符串)自动操作django_session表
auth.login(request, user_obj)


    '''views.py'''
def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 1.校验用户名和密码是否正确(不分开校验) 自己无法比对密码 必须要使用auth模块提供的方法
        user_obj = auth.authenticate(request, username=username, password=password)  # 用户名和密码正确了之后返回的是数据对象 不正确则返回none
        if user_obj:
            # 2.用户登陆成功(返回给客户端登陆的凭证、令牌、随机字符串)
            auth.login(request, user_obj)  # 自动操作django_session表
            '''
            当执行完上述操作之后 我们就可以通过request.user直接获取当前登陆用户的对象数据
            '''
            return HttpResponse(f'{username}登陆成功')
    return render(request, 'loginPage.html')    

image

image

  • 模拟博客园效果
我们可以使用request.user来查看登陆的用户是谁,如果已登录,那么print(request.user)的结果就是用户名,未登录就是AnonymousUser

同样我们也可以用request.user.is_authenticated将是否登陆用布尔值表示:如果已有用户登录,print(request.user.is_authenticated)结果是True,未登录则是Flase

模拟博客园效果:当用户登陆时,展示用户的姓名,当用户未登录时,展示的是注册和登陆两个标签
    
        '''views.py'''
def home_func(request):
    return render(request, 'homePage.html', locals())

        '''homePage.html'''
<body>
    {% if request.user.is_authenticated %}
        <h1>{{ request.user.username }}</h1>
    {% else %}
        <a href="">注册</a>
        <a href="">登陆</a>
    {% endif %}
</body>    

image

image

  • 校验用户是否登陆装饰器
如果某个页面只有登录之后才能查看,根据昨天学习的内容我们可以写一个装饰器并且在路由后面加一个问号再加一个键值对来表示本来想要访问的页面。在auth模块中这些内容都已被封装好
首先导入模块:
from django.contrib.auth.decorators import login_required


# 局部
如果登录页面的路由和我们制定的不一样,我们可以在括号内指定登陆路由:
@login_required(login_url='/login/') #可以明确指定用户没有登陆之后跳转到哪个网址
def index_func(request):
    return HttpResponse('index页面,只有登录才能查看')


# 全局
如果很多个函数的登陆路由都一样,那么我们可以直接在setting.py中写:
LOGIN_URL = '/login/'
在视图函数中就无须重复指定登陆路由:只要被该装饰器装饰的函数没有登陆之前都会跳转到指定登陆的页面
@login_required
def index_func(request):
    return HttpResponse('index页面,只有登录才能查看')

image

  • 修改密码
# 判断原密码是否正确
request.user.check_password(old_pwd)
# 修改密码
request.user.set_password(new_pwd)
request.user.save()

       '''views.py'''
@login_required  # 修改密码之前必须要获取是哪个用户,所以要先登录
def set_pwd_func(request):
    if request.method == 'POST':
        old_pwd = request.POST.get('old_pwd')
        new_pwd = request.POST.get('new_pwd')
        confirm_pwd = request.POST.get('confirm_pwd')
        if not confirm_pwd == new_pwd:
            return HttpResponse('两次密码不一致')
        # 1.判断原密码是否正确
        is_right = request.user.check_password(old_pwd)
        if not is_right:
            return HttpResponse('原密码不正确')
        # 2.修改密码
        request.user.set_password(new_pwd)
        request.user.save()  # 一定要保存 否则不会修改
    return render(request, 'setPwdPage.html')    

image

  • 退出登录
# 退出登录
    auth.logout(request)可以自动将sessioon表中的对应关系删除
    
    '''views.py'''
@login_required
def logout_func(request):
    auth.logout(request)
    return HttpResponse('成功退出登录')

扩展auth_user表

还想使用auth模块的功能 并且又想扩展auth_user表的字段

方法1: 编写一对一表关系
    
方法2:类继承(推荐)
    步骤1:模型层编写模型类继承AbstractUser
   	from django.contrib.auth.models import AbstractUser class
    UserInfo(AbstractUser):
    # 填写AbstractUser表中没有的字段
    phone = models.BigIntegerField()
    desc = models.TextField()

    步骤2:一定要在配置文件中声明替换关系
    AUTH_USER_MODEL = 'app01.UserInfo'

ps:替换还有一个前提 就是数据库迁移没有执行过(auth相关表没有创建)
posted @ 2022-12-28 19:56  Super小赵  阅读(32)  评论(0编辑  收藏  举报
****************************************** 页脚Html代码 ******************************************