简介
Django自带了强大的用户认证系统Auth
, 执行数据库迁移命令之后默认产生的auth_user
表来存储用户的数,自带的admin
后台管理用户登录参考的就是auth_user
表
创建admin后台管理员用户:
python manage.py createsuperuser
auth_user 表字段
字段 | 释义 |
---|---|
id | ID |
password | 密码 |
last_login | 最后登录时间 |
is_superuser | 是否是管理员 |
username | 用户名 |
first_name | 姓 |
last_name | 名 |
邮箱 | |
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_password
、request.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
模块所有的方法都可以直接在自定义模型类上面使用(自动切换参照表)