auth模块
(1)介绍
- 其实我们在创建好一个Django项目之后直接执行数据库迁移命令会生成很多表
- django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且还必须是管理员用户才能进入
(2)创建超级用户(管理员)
| python manage.py createsuperuser |

(3)auth.authenticate 校验数据
| 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) |
| print(user_obj) |
| print(user_obj.username) |
| print(user_obj.password) |
| return render(request, 'login.html') |
(4)auth.login() 保存用户状态
- 只要执行了该方法 就可以在任何地方通过request.user获取到当前登录的用户对象
| auth.login(request,user_obj) |
| 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: |
| auth.login(request,user_obj) |
| return render(request, 'login.html') |

(5)is_authenticated 验证用户是否登录
| request.user.is_authenticated() |
| 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: |
| auth.login(request, user_obj) |
| return redirect(to='home') |
| return render(request, 'login.html') |
| |
| |
| def home(request): |
| print(request.user) |
| res = request.user |
| print(res.username) |
| print(request.user.is_authenticated) |
| return HttpResponse('ok') |
(6)登录验证装饰器
- 局部配置 用户没有登陆就跳转到
login_url
后面指定的路由
| from django.contrib.auth.decorators import login_required |
| @login_required(login_url='/login/') |
| def home(request): |
| print(request.user) |
| res = request.user |
| print(res.username) |
| print(request.user.is_authenticated()) |
| return HttpResponse('ok') |
| @login_required |
| def home(request): |
| print(request.user) |
| res = request.user |
| print(res.username) |
| print(request.user.is_authenticated()) |
| return HttpResponse('ok') |
局部/全局优先级
局部大于全局
各自的优点
全局的好处在于无需书写重复的代码,但是页面的跳转很单一
局部的好处是在于不同的视图函数再用户没有登陆的情况下可以跳转到不同的页面
(7)修改密码
- 比对输入的密码和原密码是否相符
check_password(旧密码)
- 设置密码
set_password(新密码)
- 设置完要保存
save()
| @login_required |
| def set_password(request): |
| if request.method == 'POST': |
| old_password = request.POST.get('old_password') |
| new_password = request.POST.get('new_password') |
| confirm_password = request.POST.get('confirm_password') |
| |
| if new_password == confirm_password: |
| |
| is_right = request.user.check_password(old_password) |
| |
| if is_right: |
| |
| request.user.set_password(confirm_password) |
| |
| request.user.save() |
| return redirect('/login/') |
| return render(request, 'set_password.html', locals()) |
| <form action="" method="post"> |
| {% csrf_token %} |
| <p>username:<input type="text" name="username" disabled value="{{ request.user.username }}"></p> |
| <p>old_password:<input type="text" name="old_password"></p> |
| <p>new_password:<input type="text" name="new_password"></p> |
| <p>confirm_password:<input type="text" name="confirm_password"></p> |
| <input type="submit" class="btn btn-success"> |
| </form> |
(8)注销
| @login_required |
| def login_out(request): |
| auth.logout(request) |
| return redirect('/login/') |
(9)注册
| from django.contrib.auth.models import User |
| def register(request): |
| if request.method == 'POST': |
| username = request.POST.get('username') |
| password = request.POST.get('password') |
| |
| |
| |
| User.objects.create_user(username=username, password=password) |
| |
| |
| return render(request, 'register.html') |
(10)auth模块表扩展
(1)方式一
| from django.db import models |
| from django.contrib.auth.models import User |
| |
| |
| |
| class UserDetail(models.Model): |
| phone = models.CharField(max_length=11) |
| user = models.OneToOneField(to='User', on_delete=models.CASCADE) |
(2)方式二
| from django.db import models |
| from django.contrib.auth.models import User, AbstractUser |
| |
| |
| class UserInfo(AbstractUser): |
| ''' |
| 如果继承了AbstractUser |
| 那么在执行数据库迁移命令的时候,auth_user表就不会被创建 |
| 而 UserInfo 会在 auth_user表 的基础上添加自定义扩展的字段 |
| |
| 优点: |
| 直接通过自己定义的表快速完成操作及扩展 |
| |
| 前提 |
| (1)在执行之前没有执行过数据库迁移命令 |
| auth_user 表没有被创建 |
| 如果当前库已经被创建,则需要更换新的库 |
| (2)继承的类里面不要覆盖 AbstractUser 里面的字段名 |
| 表里面有的字段不要动,只扩展额外的字段即可 |
| (3)需要再配置文件中声明Django要使用 UserInfo 替代 auth_user |
| AUTH_USER_MODEL = 'app01.UserInfo' ---'应用名.表名' |
| ''' |
| phone = models.CharField(max_length=32) |
需要再配置文件中声明 Django 要使用 UserInfo
替代 auth_user
| AUTH_USER_MODEL = 'app01.UserInfo' ---'应用名.表名' |
如果自己写表代替了 auth_user
auth模块
功能正常使用,参考的表也由 auth_user
变成了 UserInfo
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通