Auth模块是什么
Auth模块式是jango自带的用户认证码模块
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统,此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能。
Django作为一个完美主义者的中级框架,当然也会想到用户的这些痛点,所以它内置了强大的用户认证系统-Auth。它默认使用auth_user表来存储用户数据。
在执行数据库迁移命令的时候,会自动生成一个默认的表,其中有auth_开头的很多表。
auth_user表的作用:Django自带的后台管理系统所依赖的数据就在这张表中。默认情况下是空表,没有用户名和密码。因此我们需要自己创建用户数据。但是我们创建的需要是一个超级管理员才能登录
python3.10 manage.py createsuperuser
zhangjiejia@zhangjiejiasMBP Atyuki % python3.10 manage.py createsuperuser
Username (leave blank to use 'zhangjiejia'): JJ
Email address: Jeazhang828@sina.com
Password:
Password (again):
Superuser created successfully.
在auth_user表里面is_superuser
是1就是超级用户,0就是普通用户
Auth模块常用方法
Auth模块的登录功能
from django.contrib import auth
# Auth模块的登录功能
def auth_login(request):
if request.method == 'POST':
# 接收前端传过来的数据
username = request.POST.get('username')
password = request.POST.get('password')
# 验证用户名和密码是否正确
# 1. 去哪个表中核验
# 2. 要哪个字段来比较
'''
这里的登录我们使用Auth模块,登录的时候我们使用的表是auth_user这张表
'''
# 查看了源码后,发现后面是**打散,所以我们用关键字参数传参
user_obj = auth.authenticate(request, username=username, password=password)
print(user_obj) # 打印出来后是 用户名。 这个就是用户登录成功之后的用户对象
print(user_obj.username)
print(user_obj.password)
'''
注意事项:
传递参数的时候,用户名和密码必须同时传入。
'''
# 如果登录成功
if user_obj:
# 保存用户登录的状态, 这里切记既然已经使用了auth模块就继续使用auth模块不要再自己创建方法了
auth.login(request, user_obj)
# 而且只要写了auth.login,那么就可以在全局任何有request对象的地方通过request.user拿到用户的对象
return redirect(request, '/home/')
return render(request, 'auth/auth_login.html')
Auth模块的登录验证功能
# Auth模块的验证登录功能
@login_required(login_url='/auth_login/')
def auth_check(request):
print(request.user.is_authenticated)
if request.user.is_authenticated:
# 处理登录后的逻辑
pass
else:
print('check')
# 没有登录,跳转登录界面
redirect('/auth_login/')
return HttpResponse("LOGGINED")
Auth模块的退出登录登录
# 退出登录功能
def logout(request):
# 清除cookie或者session
# 因为源码中需要用到request,所以request必须传
auth.logout(request)
return redirect('/home/')
Auth模块的修改密码功能
# Auth更改密码的功能
def set_password(request):
if request.method == 'POST':
print('check1')
old_pswd = request.POST.get('old_password')
new_pswd = request.POST.get('new_password')
aga_pswd = request.POST.get('aga_password')
# 先验证两次密码是否输入一直
if new_pswd == aga_pswd:
print('check2')
# 验证老密码是否正确,否则不让修改
is_right = request.user.check_password(old_pswd)
if is_right:
print('check3')
# 修改密码
request.user.set_password(new_pswd)
request.user.save()
return redirect('/login/')
return render(request, 'Auth/set_password.html')
Auth模块注册功能
from django.contrib.auth.models import User
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password_raw = request.POST.get('password_raw')
password_check = request.POST.get('password_check')
if password_raw == password_check:
User.objects.create_user(username=username, password=password_raw)
return redirect('/login/')
return render(request, 'auth/register.html')
Auth模块的扩展
默认情况下使用的就是Auth_user的默认字段,但是我们也可以扩展自己的字段
前提是:所有的模型类都能继承,扩展之后需要再配置文件中加一句话
在扩展表之前数据库不能迁移,扩展这个表需要再迁移数据库之前。
如果迁移了后,还想扩展怎么办?
1. 换库
2. 需要删除很多个应用的migrations文件夹,auth_migration表里面的迁移记录也需要删除
所以在扩展表之前要想好都需要什么字段