Django中的auth用法
Auth模块:用户认证
我们没用auth模块前的验证方法:authenticate
def auth_login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') models.User.objects.filter(username = username,password = password).first() # 我们通过django的orm查询表里有没有对应的数据,有的话登录成功 return render(request,'auth_login.html')
用auth模块:
def auth_login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # models.User.objects.filter(username = username,password = password).first() user_obj = auth.authenticate(request,username = username,password = password) # 相当于执行了上面的那句,得到一个用户对象,获取到的明文密码会自动转为密文去数据库比较 return render(request,'auth_login.html')
登录成功后记录用户的登录状态:auth.login
# 记录用户状态 request.session['name'] = username # auth模块记录 auth.login(request,user_obj) # request.session保存的只是字符串,而auth保存的则是对象,一但记录了,可以在任意地方通过request.user获取到当前登录对象,
未登录状态取request.user 后台会返回 AnonymousUse(匿名用户)
判断当前用户是否登录:is_authenticated
request.user.is_authenticated()
# 登录返回Ture
退出登录:logout
auth.logout(request) # 相当于 request.session.flush()
用auth模块完成注册功能时记住,用就全都用auth
保存注册用户时:create_user
models.User.object.create(username=username,password=password) User.objects.create(username=username,password=password) # 这里保存用户不能在用create,否则密码会以明文的形式保存 User.objects.create_user(username=username,password=password) # 创建普通用户 User.objects.create_superuser(username=username,password=password,email='123@qq.com') # 创建超级用户,登录后台管理系统,需要邮箱。
修改密码:check_password、setpassword
def auth_password(request): print(request.user.password) # 打印出来的password是密文形式 old_password = request.POST.get('old_password') # 获取用户输入的旧密码 new_password = request.POST.get('new_password') # 获取用户输入的新密码 is_res = request.user.check_password(old_password) # 去数据库比对是否正确 if is_res: request.user.setpassword(new_password) # 设置新密码 request.user.save() # 保存密码,这一步不能少,否则密码不会被修改
登录验证:login_required
from django.contrib.auth.decorators import login_required @login_required(login_url='/login/') # 局部配置 def home(request): return HttpResponse('ok')
# 全局配置需要在settings中配置参数 LOGIN_URL = '/login/' from django.contrib.auth.decorators import login_required @login_required # 装饰器后面不需要指定跳转页面,直接跳到全局配置的页面 def home(request): return HttpResponse('ok')
扩展默认的auth_user表
想要加一个存储用户手机号的字段
我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。
from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser):#继承AbstractUser """ 用户信息表 """ nid = models.AutoField(primary_key=True)#这样就相当于在自己的类中可以派生出新的字段 phone = models.CharField(max_length=11, null=True, unique=True)# def __str__(self): return self.username#字符串原样输出
注意:
按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:
# 引用Django自带的User表,继承使用时需要设置,不加数据库迁移不了 AUTH_USER_MODEL = "app名.UserInfo"
再次强调:
一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步