django 自带auth模块 实现 用户 注册、登录、验证、注销
- Auth模块
只要是跟用户相关的登陆、注册、校验、修改密码、注销、验证用户是否登陆
内容详细
Auth模块
"""
其实我们在创建好一个django项目之后直接执行数据库迁移命令会自动生成很多表
django_session
auth_user
django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参
考的就是auth_user表,并且还必须是管理员用户才能进入
创建超级用户(管理员)
python3 manage.py createsuperuser
依赖于auth_user表完成用户相关的所有功能
"""
方法总结
# 1.比对用户名和密码是否正确 user_obj = auth.authenticate(request,username=username,password=password) # 括号内必须同时传入用户名和密码 print(user_obj) # 用户对象 jason 数据不符合则返回None print(user_obj.username) # jason print(user_obj.password) # 密文 # 2.保存用户状态 auth.login(request,user_obj) # 类似于request.session[key] = user_obj # 主要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象 # 3.判断当前用户是否登陆 request.user.is_authenticated() # 4.获取当前登陆用户 request.user # 5.校验用户是否登陆装饰器 from django.contrib.auth.decorators import login_required # 局部配置 @login_required(login_url='/login/') # 全局配置 @login_required settings.py里面去配置 LOGIN_URL = '/login/' 1.如果局部和全局都有 该听谁的? 局部 > 全局 2.局部和全局哪个好呢? 全局的好处在于无需重复写代码 但是跳转的页面却很单一 局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面 # 6.比对原密码 request.user.check_password(old_password) # 7.修改密码 request.user.set_password(new_password) # 仅仅是在修改对象的属性 request.user.save() # 这一步才是真正的操作数据库 # 8.注销 auth.logout(request) # 9.注册 # 操作auth_user表写入数据 User.objects.create(username=username,password=password) # 写入数据 不能用create 密码没有加密处理 # 创建普通用户 User.objects.create_user(username=username,password=password) # 创建超级用户(了解):使用代码创建超级用户 邮箱是必填的 而用命令创建则可以不填 User.objects.create_superuser(username=username,email='123@qq.com',password=password)
如何扩展auth_user表
from django.db import models from django.contrib.auth.models import User,AbstractUser # Create your models here. # 第一种:一对一关系 不推荐 # class UserDetail(models.Model): # phone = models.BigIntegerField() # user = models.OneToOneField(to='User') # 第二种:面向对象的继承 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.BigIntegerField() """ 你如果自己写表替代了auth_user那么 auth模块的功能还是照常使用,参考的表页由原来的auth_user变成了UserInfo 我们bbs作业用户表就是用的上述方式 """
urls
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login', views.login), url(r'^home', views.home), # 修改密码 url(r'^set_password', views.set_password), # 注销 url(r'^logout', views.logout), # 注册 url(r'^register', views.register), ]
templates
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> </head> <body> <form action="" method="post"> {% csrf_token %} <p>username: <input type="text" name="username"></p> <p>password: <input type="text" name="password"></p> <input type="submit"> </form> </body> </html>
views
from django.shortcuts import render, redirect, HttpResponse from django.contrib import auth def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 去用户表中校验数据 # 1.表如何获取 # 2.密码如何比对 user_obj = auth.authenticate(request, username=username, password=password) # print(user_obj) # 这个拿到的是一个用户对象,如果输入的账户密码不正确返回none # print(user_obj.username) # 可以点点点 # print(user_obj.password) if user_obj: # 保存用户状态(操作session表) # 只要执行了该方法,就可以在任何地方通过request.user获取到当前登陆的用户对象 auth.login(request, user_obj) # 类似于request.session[key] = user_obj return redirect('/home/') ''' 1.自动查找auth_user表 2.自动给密码加密再比对 注意事项:括号内必须同时传入用户名和密码,不能只传用户名(一步就筛选出用户对象) ''' return render(request, 'login.html') from django.contrib.auth.decorators import login_required @login_required # 这是全局的装饰器, 优先级 局部>全局 @login_required(login_url='/login/') # 参数的意思是没登录的时候跳转到login_url后面指定的网址 def home(request): # 自动去django_session表里面查找对应的用户对象给你封装到request.user中 print(request.user) # 用户对象 # 如果没有登陆,会出现 AnonymousUser (没用用户的意思) # 判断用户是否登陆 print(request.user.is_authenticated) # 是否登陆 返回T/F # return HttpResponse('home') @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(new_password) # 只执行到这一步是不会修改数据库的 request.user.save() # 这一步才是真正的操作数据库 return render(request, 'set_password.html', locals()) # 注销 @login_required def logout(request): auth.logout(request) # 等价于request.session.flush() return redirect('/login/') from django.contrib.auth.models import User # 这里是找到user表 def register(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 操作auth_user表写入数据 # 写入数据不能用create 因为密码不能加密处理 # User.objects.create(username=username, password=password) # 创建普通用户 User.objects.create_user(username=username, password=password) # 怎么创建超级用户呢,使用代码创建,邮箱是必填的 # 命令行创建 就可以不填 (了解,因为不会把超级用户暴露给用户) # User.objects.create_superuser(username=username, email='123@qq.com', password=password) return render(request, 'register.html')

浙公网安备 33010602011771号