简介

Django自带了强大的用户认证系统Auth, 执行数据库迁移命令之后默认产生的auth_user表来存储用户的数,自带的admin后台管理用户登录参考的就是auth_user

创建admin后台管理员用户:

python manage.py createsuperuser

auth_user 表字段

字段释义
idID
password密码
last_login最后登录时间
is_superuser是否是管理员
username用户名
first_name
last_name
email邮箱
is_staff是否是工作人员
is_active是否激活
date_joined创建时间

常用方法

登入认证

关键字:auth.authenticate()

from django.shortcuts import redirect, HttpResponse, render
from django.contrib import auth


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = auth.authenticate(request, username=username, password=password)
        if user_obj:
            print(user_obj, '登录成功', type(user_obj))
        else:
            print("效验失败", user_obj)
    return render(request, 'login.html')    

保存用户状态

关键字:auth.login()

# 登入成功后调用
auth.login(request, user_obj)   # 内部调用的就是 request.session['key']=user_obj

获取当前用户对象

关键字:request.user

# 登入成功,并保存用户状态

判断当前用户是否登录

关键字:request.user.is_authenticated()

res = request.user
print(res)
# 登录打印:用户名
# 未登录打印:AnonymousUser

校验登录装饰器

关键字:@login_required(login_url='登录页面路径')

局部配置

from django.shortcuts import redirect, HttpResponse, render
from django.contrib import auth
from django.contrib.auth.decorators import login_required


def login(request):
    res = request.user
    print(res)
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = auth.authenticate(request, username=username, password=password)
        if user_obj:
            print(user_obj, '登录成功', type(user_obj))
            auth.login(request, user_obj)
            target_path = request.GET.get('next')
            return redirect(target_path)
        else:
            print("效验失败", user_obj)
    return render(request, 'login.html')


@login_required(login_url='/login/')  # 局部配置
def home(request):
    return HttpResponse('只有登录的用户能看到')

全局配置

settings.py

LOGIN_URL = '/login/'  # 需要在配置文件中添加配置

view.py

@login_required  # 全局部配置
def home(request):
    return HttpResponse('只有登录的用户能看到')

修改密码

关键字:request.user.check_password()request.user.set_passwordrequest.user.save()

from django.shortcuts import redirect, HttpResponse, render
from django.contrib import auth
from django.contrib.auth.decorators import login_required


def login(request):
    user_obj = auth.authenticate(request, username='kevin', password='admin123')
    print(user_obj)
    auth.login(request, user_obj)
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        if request.user.check_password(old_password):  # 检验密码返回 True or False
            request.user.set_password(new_password)  # 修改密码
            request.user.save()  # 一定要保存
        else:
            return HttpResponse('旧密码错误')

    return render(request, 'login.html')

注销登录

关键字:auth.logout(request)

# 注销当前登录用户:
auth.logout(request)  # 内部使用的就是 request.session.flush()

注册用户

from django.contrib.auth.models import User
# 创建管理员用户
user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',..)
# 创建普通用户
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

补充

  • request.user.username : 获取用户名
  • request.user.password :获取密码
  • request.user.is_staff:判断用户是否拥有网站的管理权限
  • request.user.is_active :判断是否允许用户登录
  • request.user.is_superuser:判断是否是超级管理员

扩展表字段

继承(推荐)

class MyUser(AbstractUser):
    # 编写AbstractUser类中没有的字段,不能冲突
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=64)

settings.py

# 不在使用auth_user 而是使用自定义的表
AUTH_USER_MODEL = 'app01.MyUser'

注意

  • 类继承之后,库里面是第一次操作才可以,然后再执行数据库迁移命令,并且是
  • auth模块所有的方法都可以直接在自定义模型类上面使用(自动切换参照表)
Last modification:May 29, 2022
如果觉得我的文章对你有用,请随意赞赏