Django Auth 登录认证

一、Auth 模块介绍

  • 用户模型:用户认证、登录、退出等
  • 后台管理:用户管理、权限分配
  • Django自带一个用户认证系统,用于处理账号、组、权限以及基于Cookie的用户会话

1.1 安装与配置

# 通常已自带
# INSTALLED_APPS 安装应用
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
# MIDDLEWARE 中间件配置
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
# 数据库迁移命令
# 自己在命令行中执行:
python manage.py makemigrations
python manage.py migrate

1.2 Auth 用户类型

  • 注册用户(User),超级用户,普通用户
  • 游客(AnonymousUser)

1.3 Auth 常用字段含义

序号 字段 说明
1 username 用户名
2 password 登录密码
3 email 邮箱
4 first_name
5 last_name
6 is_superuser 是否是超级管理员账号/admin
7 is_staff 是否可以访问admin管理后台
8 is_active 是否是活跃用户,默认为True,一般不删除,而是将用用户的is_active设置为False
9 is_authenticated 用户是否已登录的只读属性
10 is_anonymous 用户是否登录失效的只读属性
11 date_joined 用户创建的时间
12 last_login 上一次登录时间
13 groups 用户组多对多关系
14 user_permission 用户权限多对多关系

二、Auth 用户信息管理

官网参考地址:https://docs.djangoproject.com/zh-hans/3.2/topics/auth/default/#user-objects

2.1 创建用户

  • 创建普通用户
from django.contrib.auth.models import User
# 只有usename是必填项,其余可不填
# 创建密码为明文密码的普通用户
User.objects.create(username="AA",password="123")
# 创建密码为通过Django内部自动加密的密码的普通用户
User.objects.create_user(username="AA",password="123")
  • 创建超级用户
from django.contrib.auth.models import User
# 只有usename是必填项,其余可不填
User.objects.create_superuser(username="AA",password="123")

2.2 删除用户

建议使用:伪删除,即将is_active修改为False

from django.contrib.auth.models import User

try:
    user = User.objects.get(username = "用户名")
    user.is_ active = False 
    user.save()
    print("删除用户成功")
except:
    print("删除用户失败,或该用户不存在")

注意: 不可用update来更新,User不能用。

user = User.objects.get(username = "用户名")
user.update(is_active=True)
"""
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'User' object has no attribute 'update'
"""

2.3 密码管理

  • 修改密码
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
from django.contrib.auth.models import User

try:
    user = User.objects.get(username="用户名")
    user.set_password("明文密码")
    user.save()
	return HttpResponse("修改密码成功")
except:
    return HttpResponse("修改密码失败")
  • 校验密码是否正确
u = User.objects.get(username='aa')
u.check_password('my password')

三、Auth 登录校验

3.1 authenticate 登录校验

from django.contrib.auth import authenticate
user = authenticate(username = username,password=password)

说明: 若用户名密码校验成功则返回对应的user对象,否则返回None。

from django.contrib.auth import authenticate
user = authenticate(username="AA",password="123")
# 正确输出
user
<User: AA>

3.2 Auth 登录状态保持

from django.contrib.auth import login
from django.contrib.auth import authenticate

def login_view(request):
    ...
    # 先校验
    user = authenticate(username="用户名",password="密码")
    ...
    # 检验成功则保持登录状态
    login(request,user) # 若用户通过检验,则可以调用此来保持登录状态

注: 保存的方式为session,且时间不可以控制,当session什么时候过期,那么就什么时候断开。

3.3 Auth 登录状态校验

同前,用django自带登录状态校验装饰器,实现登录状态的校验。哪个视图需要,就放在哪个视图之前。

  • 未登录需要跳转地址,需要在settings.LOGIN_URL中设置
import django.contrib.auth.decorators import login_required

@login_required # 通过登录则返回下面视图,否则跳转至登录页面
def index_view(request):
    # 该视图必须为用户登录状态下才能访问
    # 当前登录用户通过request.user获取
    login_user = request.user
    ...

3.3 Auth 登录状态取消

from django.contrib.auth import logout
def logout(request):
    logout(request)
    # 请求传过来,然后将session清空,从而取消登录

四、 基于Auth实现登录与注册

  • 引用的相关库
# 用户模型
from django.contrib.auth.models import User
# 登录状态检验的装饰器
from django.contrib.auth.decorators import login_required
# 记录登录状态、退出登录状态、登录用户信息的校验
from django.contrib.auth import login,logout,authenticate
  • 注册
def reg_view(request):
    # 注册
    if request.method == "GET":
        return render(request,"reg_view")
    elif request.method == 'POST':
        username = request.POST.get("user")
        pwd1 = request.POST.get("pwd1")
        pwd2 = request.POST.get("pwd2")
        if not User.objects.filter(uesename=username):
            if pwd1 == pwd2:
                # 这里可以try一下,因为用户名唯一性,可能会出现SQL唯一性异常报错
                user = User.objects.create_user(username=username,password=pwd1)
            else:
                return HttpResponse("密码不一致,请重新输入")
        else:
            return HttpResponse("该用户名已注册,请重新输入")

        # # 实现用户注册后免登录
        # login(request,user)
        # return HttpResponseRedirect("/index")
        return HttpResponseRedirect("/login")
  • 登录
def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    elif request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = authenticate(username=username,password=password)
        if not user:
            # 用户名或密码错误
            return HttpResponse("用户名或密码错误")
        else:
            # 校验成功
            # 记录会话登录状态
            login(request,user)
            return HttpResponseRedirect("/index")
  • 退出
def logout(request):
    logout(request)
    return HttpResponseRedirect("/login")
  • 首页
# 需要登录状态检验才能访问的页面
@login_required()
def index_view(request):
    # 首页,必须登录才能访问,未登录跳转至settings.LOGIN_URL设置
    # 获取当前登录用户名
    user = request.user
    return render(request,"index.html")

五、 扩展 Django 中的用户模型

当我们要使用如手机号字段时,发现用户字段不够用,这时就需要想办法来增加字段。

  • 方案1:通过建立新表,与内建表做一对一验证
    • 应用时查询较麻烦
  • 方案2:继承内建的抽象User模型类
    • 继承现有的模型字段到一个新表,将我们的表告知Django将原User模型类替换为SelfUser模型类

继承内建抽象类: 后台管理密码修改问题解决方案

  • step1:添加新应用
  • step2:定义模型类,继承AbstractUser
# 所在位置:appname/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.

class UserInfo(AbstractUser):
    # 在原有的基础上,添加一个手机号字段
    phone = models.CharField(max_length=11,default="")
  • step3:settings.py中指明AUTH_USER_MODDEL="应用名.类名"
# 所在位置 mysite_name/settings.py
AUTH_USER_MODEL = 'appname.UserInfo'
  • step4:最好在首次执行数据库迁移命令。

注意: 此流程最好要在第一次migrate时执行,否则用方案1合适。后面一切调用模型类时就应该是UserInfo这个模型类了。

–添加新用户–

from user.models import UserInfo
user = UserInfo(username="XX",password="xxxx",phone="xxxxxxxx")

你可能感兴趣的:(Django,django,python,Auth登录认证)