简介

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

创建admin后台管理员用户:

  1. python manage.py createsuperuser

auth_user 表字段

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

常用方法

登入认证

关键字:auth.authenticate()

  1. from django.shortcuts import redirect, HttpResponse, render
  2. from django.contrib import auth
  3. def login(request):
  4. if request.method == 'POST':
  5. username = request.POST.get('username')
  6. password = request.POST.get('password')
  7. user_obj = auth.authenticate(request, username=username, password=password)
  8. if user_obj:
  9. print(user_obj, '登录成功', type(user_obj))
  10. else:
  11. print("效验失败", user_obj)
  12. return render(request, 'login.html')

保存用户状态

关键字:auth.login()

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

获取当前用户对象

关键字:request.user

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

判断当前用户是否登录

关键字:request.user.is_authenticated()

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

校验登录装饰器

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

局部配置

  1. from django.shortcuts import redirect, HttpResponse, render
  2. from django.contrib import auth
  3. from django.contrib.auth.decorators import login_required
  4. def login(request):
  5. res = request.user
  6. print(res)
  7. if request.method == 'POST':
  8. username = request.POST.get('username')
  9. password = request.POST.get('password')
  10. user_obj = auth.authenticate(request, username=username, password=password)
  11. if user_obj:
  12. print(user_obj, '登录成功', type(user_obj))
  13. auth.login(request, user_obj)
  14. target_path = request.GET.get('next')
  15. return redirect(target_path)
  16. else:
  17. print("效验失败", user_obj)
  18. return render(request, 'login.html')
  19. @login_required(login_url='/login/') # 局部配置
  20. def home(request):
  21. return HttpResponse('只有登录的用户能看到')

全局配置

settings.py

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

view.py

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

修改密码

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

  1. from django.shortcuts import redirect, HttpResponse, render
  2. from django.contrib import auth
  3. from django.contrib.auth.decorators import login_required
  4. def login(request):
  5. user_obj = auth.authenticate(request, username='kevin', password='admin123')
  6. print(user_obj)
  7. auth.login(request, user_obj)
  8. if request.method == 'POST':
  9. old_password = request.POST.get('old_password')
  10. new_password = request.POST.get('new_password')
  11. if request.user.check_password(old_password): # 检验密码返回 True or False
  12. request.user.set_password(new_password) # 修改密码
  13. request.user.save() # 一定要保存
  14. else:
  15. return HttpResponse('旧密码错误')
  16. return render(request, 'login.html')

注销登录

关键字:auth.logout(request)

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

注册用户

  1. from django.contrib.auth.models import User
  2. # 创建管理员用户
  3. user = User.objects.create_superuserusername='用户名',password='密码',email='邮箱',..)
  4. # 创建普通用户
  5. user = User.objects.create_userusername='用户名',password='密码',email='邮箱',...)

补充

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

扩展表字段

继承(推荐)

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

settings.py

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

注意

  • 类继承之后,库里面是第一次操作才可以,然后再执行数据库迁移命令,并且是
  • auth模块所有的方法都可以直接在自定义模型类上面使用(自动切换参照表)