Django之auth认证模块

发布时间 2023-05-08 19:18:44作者: 南柯unique

前戏:

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

auth模块封装了cookie和session还有很多之前学过的方法,只需要学会如何使用auth模块,如何调用它封装的方法即可
如何创建创建超级管理员?

python38 manage.py createsuperuser

image
不能直接在终端建普通用户

auth模块的使用

基于auth_user表编写用户相关的各项功能,这里就需要借助于auth模块
登录、校验用户是否登录、修改密码、注销登录等

接下来就介绍auth模块的方法如何使用,主要实现下面这几个功能,URL视图层显示:

  # auth用户注册
    path('register/', views.register_func),
    # auth用户登录
    path('login/', views.login_func),
    # 网站首页
    path('home/', views.home_func),
    # index页面 只有登录的用户才可以看
    path('index/', views.index_func),
    # auth用户修改密码
    path('set_pwd/', views.set_pwd_func),
    # auth用户退出登录
    path('logout/', views.logout_func)

auth之用户注册

在写方法之前,需要先导入两个模块

from django.contrib import auth
from django.contrib.auth.models import User

views函数

def register_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 1.校验用户名是否存在    res = <QuerySet [<User: yzk>]>
        res = User.objects.filter(username=username)
        if res:
            return HttpResponse('该用户已经存在')
        # 2.注册该用户
        # create方法不可以使用,因为密码不加密
        # User.objects.create(username=username, password=password)
        # create_user方法会自动对密码加密
        User.objects.create_user(username=username, password=password)
    return render(request, 'registerPage.html')

html页面

<form action="" method="post">
    {% csrf_token %}
    <p>
        username:
        <input type="text" name="username">
    </p>
    <p>
        password:
        <input type="text" name="password">
    </p>
    <input type="submit">
</form>

auth模块之登录

request.user方法介绍

该方法如果用户是登录过后,则是用户对象,如果没有登录,则是匿名用户

request.user.is_authenticated

判断当前用户是否已经登录,返回是bool值
views视图函数

def login_func(request):
    print(request.user)
    print(request.user.is_authenticated)
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 1.校验用户名和密码是否正确(不分开校验) 自己无法比对密码 必须要使用auth模块提供的方法才可以
        # 这里是方法里面调用了__str__魔法,返回一个真实的登录对象名字
        user_obj = auth.authenticate(request, username=username, password=password)
        # print(user_obj)    # yzk1
        # print(user_obj.username)   # yzk1
        # print(user_obj.password)   # pbkdf2_sha256$150000$1M0w3apWMYbt$Qno5MJoPyOTkGVUQOdCi5PK0G21RLq62RCHjljB/AYg=
        if user_obj:
            # 2.用户登录成功(返回给客户端登录的凭证、令牌、随机字符串)
            auth.login(request, user_obj)   # 自动操作django_session表
            '''
            当执行完上述的操作之后 我们就可以通过request.user直接获取当前登录的用户对象数据
            '''
            return HttpResponse('登录成功')


    return render(request, 'loginPage.html')

html页面

<form action="" method="post">
    {% csrf_token %}
    <p>
        username:
        <input type="text" name="username">
    </p>
    <p>
        password:
        <input type="text" name="password">
    </p>
    <input type="submit">
</form>

auth模块之网页首页

views视图函数

def home_func(request):
    print(request.user.is_authenticated)
    print(request.user)
    return render(request, 'homePage.html', locals())

html页面

    {% if request.user.is_authenticated %}
        <h1>{{ request.user.username }}</h1>
        {% else %}
        <a href="">注册</a>
        <a href="">登录</a>
    {% endif %}

auth模块之用户登录过直接跳转页面

需要导入装饰器
校验用户是否登录装饰器

from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')  局部配置 
@login_required			全局配置
 配置文件中LOGIN_URL = '/login/'

出现找到页面的问题,所以导入装饰器的时候,要指定路径
image

views视图函数

from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')   # 可以明确指定用户没有登录之后跳转到哪个地址
def index_func(request):
    return HttpResponse('index页面 只有登录的用户才可以查看')

auth模块之用户修改密码

views视图函数层

@login_required(login_url='/login/')
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 new_pwd == confirm_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 HttpResponse('修改密码成功')

    return render(request, 'setPage.html')

html

<form action="" method="post">
    {% csrf_token %}
    <p>原密码:
        <input type="text" name="old_pwd">
    </p>
    <p>新密码:
        <input type="text" name="new_pwd">
    </p>
    <p>确认密码:
        <input type="text" name="confirm_pwd">
    </p>
    <input type="submit">

auth模块之注销用户

views视图函数

@login_required
def logout_func(request):
    auth.logout(request)
    return HttpResponse('退出登录')

auth模块之扩展表

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

  • 思路1:一对一字段关联(外键)

  • 思路2:替换auth_user表
    步骤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相关表没有创建)