auth认证模块
目录
Auth模块是什么
Auth模块是Django自带的用户认证模块:
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。
Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。
Auth模块使用
当数据库进行迁移命令后,就会自动创建出auth_user表。
- 创建管理员账号
python manage.py createsuperuser
# 之后会要求输入用户名与密码,输入完成后即可创建完成
创建完成之后,就可以使用这个用户登录admin/路由了。
基于Auth模块编写用户登录功能
说明:
auth模块可以帮你做什么呢?
- 登录
- 校验用户信息
- 修改密码
- 注销登录
- 等等等等....
下面试着创建注册功能:
需要注意的几点:
- 当models.py中没有定义表时,如何操作auth_user表
from django.contrip.auth.models import User
User.objects.filter(username='xxxxx')
- 不能使用下面User.objects.create操作创建用户,因为不会对密码进行加密
from django.contrip.auth.models import User
from django.contrip import auth
# 不可以这样创建,否则密码不会加密,后期使用auth调用时会调用不到
User.objects.create(username='xxx', password='xxx')
# 需要使用create_user进行创建
User.objects.create_user(username='xxx', password='xxx')
注册功能代码
from django.contrib import auth
from django.contrib.auth.models import User
def register_func(request):
if request.method == 'POST':
# 获取前端用户名密码
username = request.POST.get('username')
password = request.POST.get('password')
# 校验用户名是否在数据库中
db_username = User.objects.filter(username=username)
# 如果用户名存在,则报错
if db_username:
return HttpResponse('用户名已存在')
# 如果用户不存在,则写入数据库并重定向到登录页面
else:
User.objects.create_user(username=username, password=password)
return redirect('/login/')
return render(request, 'register.html')
登录功能代码
def login_func(request):
if request.method == 'POST':
# 获取用户输入的用户名与密码
username = request.POST.get('username')
password = request.POST.get('password')
# 使用用户输入的用户名与密码去数据库中进行校验
user_obj = auth.authenticate(username=username, password=password) # 返回值是一个数据对象,不是一个字符串
if user_obj:
# 用户登录成功,记录session/cookie
auth.login(request, user_obj) # 自动操作django的session表
return HttpResponse('登录成功')
return render(request, 'login.html')
校验用户是否登录
request.user对象
当用户未登录时,对象返回值为:AnonymousUser
当用户已登录时,对象返回值为:登录的用户名
request.user.is_authenticated对象
判断当前用户对象是否已登录
当用户未登录时,对象返回值为:False
当用户已登录时,对象返回值为: True
用户登录返回页面不同
使用场景:当用户登录,页面返回用户名;当用户未登录,页面显示“注册、登录”两个按钮
# 视图层
def home_func(request):
return render(request, 'home.html', locals()) # 将request返回给前端
# 模板层
# 如果是登录的用户,这里就是True,就会返回用户名
{% if request.user.is_authenticated %}
<p>{{ request.user.username }}</p>
# 否则是未登录的用户,这里就是False,就会返回登录注册
{% else %}
<a href="">登录</a>
<a href="">注册</a>
{% endif %}
判断用户是否登录
使用场景:用户未登录,跳转到登录页面,用户已登录,则放行
# 1. 导入模块
from django.contrib.auth.decorators import login_required
# 2. 对应代码
@login_required(login_url='/login/') # 如果不指定login_url,会跳转到django的LOGIN_URL自动配置的一个路由
def index_func(request):
return HttpResponse('用户已登录,可以访问index')
# 3. 修改LOGIN_URL全局变量
# 修改settings.py文件,在最后添加
LOGIN_URL = '/login/'
@login_required # 此时,就会按照LOGIN_URL变量进行跳转了,就不需要指定login_url了
def index_func(request):
return HttpResponse('用户已登录,可以访问index')
用户修改密码
- 使用到的方法
request.user.check_password(old_pwd) 校验密码是否正确
request.user.set_password(new_pwd) 设置密码
request.user.save() 保存修改,修改完后必须保存
- 代码
from django.contrib.auth.decorators import login_required
@login_required
def set_pwd_func(request):
if request.method == 'POST':
old_pwd = request.POST.get('old_pwd')
new_pwd = request.POST.get('new_pwd')
confirm_pwd = request.POST.get('confirm_pwd')
if not new_pwd == confirm_pwd:
return HttpResponse('两次密码不一致')
# 判断原密码是否正确
is_true = request.user.check_password(old_pwd)
if not is_true:
return HttpResponse('原密码输入错误')
# 修改密码
request.user.set_password(new_pwd)
request.user.save() # 一定要保存,否则不会写入到数据库
return HttpResponse('密码修改成功')
return render(request, 'setPwd.html')
用户退出登录
所谓的退出登录,就是把用户手中代表cookie的信息删除即可,或删除session表中对应的数据
@login_required
def logout_func(request):
auth.logout(request) # 只需要这一个模块即可
return HttpResponse('退出成功')
扩展auth_user表
- 方法一:使用一对一外键字段关联,比较繁琐
- 方法二:直接替换auth_user表
# 替换auth_user表的方法,注意原来如果做过数据库迁移,生成过auth_user表是不行的,必须没有auth_user表
# 1. 模型层编写模型继承
# 先导入模块
from django.contrib.auth.models import AbstractUser
# 再定义表
class UserInfo(AbstractUser):
# 填写AbstractUser表中没有的字段
phone = models.CharField(max_length=11)
desc = models.CharField(max_length=64)
# 2. 在settings.py配置文件中声名替换关系
AUTH_USER_MODEL = 'app01.UserInfo'
# 3. 数据库迁移
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?