Auth模块的使用
Auth模块:Auth模块是Django自带的用户认证模块
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。
Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。
在执行数据库迁移命令的时候,会自动生成一个默认的表,其中有auth_开头的很多表
auth_user表的作用:djagno自带的后台管理系统所依赖的数据就在这张表中
默认情况下,auth_user表是空表,没有用户名和密码,因此我们需要自己创建用户数据
需要创建一个超级管理员账号才能登录:python36 manage.py createsuperuser
Auth模块的相关方法
登录功能:
##########################auth模块登录功能 # 导入Auth模块 from django.contrib import auth def login(request): if request.method == 'POST': # 从前端接受数据 username = request.POST.get('username') password = request.POST.get('password') # 验证用户名和密码是否正确 ''' 这里的登录,我们使用auth模块,登录的时候所使用的表是auth_user表 ''' user_obj=auth.authenticate(request,username=username,password=password) print(user_obj) # 得到的是登录成功之后的用户对象:hua,当查询不到的时候返回结果是None print(user_obj.username) print(user_obj.password) """ 注意事项:传递参数的时候,用户名和密码必须同时传入 """ #要么全部使用auth模块的方法,要么全部自己写,,一定别混合使用 if user_obj: # 存在则保存用户的状态: auth.login(request,user_obj) # 相当于自动保存session:request.session['username'] = user_obj.usernane '''只要写了auth.login,那么就可以在全局任何有request对象第地方通过request.user拿到用户的对象''' return render(request,'login.html')
结果:
验证是否登录:
当给order函数加了装饰器:@login_required (这里是局部设置)
# 验证是否登录成功 from django.contrib.auth.decorators import login_required @login_required def order(request): # 验证用户是否已经登录 # print(request.user.is_authenticated()) #is_authenticated()判断是否认证,登录即认证 # True:用户已登录 # # 不加括号的结果:CallableBool(True) # django2中不用加括号:is_authenticated # if request.user.is_authenticated(): # # 处理登录之后的逻辑 # pass # else: # # 没有登录,跳转到登录页面 return HttpResponse('order')
结果:当没有登录的时候,会跳转到:http://127.0.0.1:8000/accounts/login/?next=/order/
当给函数装了装饰器并指定了跳转路由:login_url='/login/',局部设置,只对当前函数起作用
from django.contrib.auth.decorators import login_required @login_required(login_url='/login/') # 局部设置:只对当前函数起作用,会跳转到指定路由 def order(request): return HttpResponse('order') @login_required def order1(request): return HttpResponse('order1')
结果:
order路由:
order1路由:
全局设置:在配置文件中修改 添加:LOGIN_URL = '/login/' # 全局配置
@login_required def order1(request): return HttpResponse('order1')
再次访问order1的结果:
当做了全局设置,但是在order函数处做了局部设置,访问order:
from django.contrib.auth.decorators import login_required @login_required(login_url='/order/login/') # 局部设置:只对当前函数起作用,会跳转到指定路由 def order(request): return HttpResponse('order')
结果:会执行局部设置的路由
当局部和全局都存在的时候,按照局部的路由执行;如果局部没有,就按照全局的
Auth模块之退出系统
# 退出系统 def logout(request): # 看自己保存的是哪种,是哪种就清楚哪种(cookie/session) #这边使用的是auth,所以我们清楚auth auth.logout(request) # logout内部其实是做session清除,需要request return redirect('/home/')
Auth模块之修改密码功能
#修改密码,需要在登录状态下 @login_required def set_password(request): # 从前端获取输入的旧密码,新密码 if request.method == 'POST': oid_password = request.POST.get('old_password') new_password = request.POST.get('new_password') re_password = request.POST.get('re_password') # 先验证两次输入的密码是否一致 if new_password == re_password: # 验证旧密码是否一致 is_right= request.user.check_password(oid_password) if is_right: # 修改密码 request.user.set_password(new_password) # 仅这一步并没有真正的操作数据库 request.user.save() return redirect('/home/') return render(request,'set_password.html')
注意:必须执行这两句命令才能真正修改密码
结果:
通过后面修改的密码成功登录:
Auth模块之注册功能、
# 注册功能: #先导入这个 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(username=username, password=password) # 会自动入库到auth_user表中,但是create创建的密码是明文,登录时会登不进去 # 用create_user来创建 # User.objects.create_user(username=username, password=password) # 创建普通用户 User.objects.create_superuser(username=username, password=password,email='[email protected]') # 超级用户要加email,可以指定,也可以从前端获取 return redirect('/login/') return render(request, 'register.html')
普通用户(0):
超级用户(1):
扩展默认的auth_user表
默认情况下使用的就是auth_user的默认字段
扩展我们自己的字段
前提是:所有的模型类都继承
from django.contrib.auth.models import AbstractUser
不要继承了models.Model
扩展之后需要在配置文件中加一句话
"""""在扩展表之前数据库不能够迁移,扩展这个表需要在迁移数据库之前做"""""
如果你迁移了,还想扩展怎么办?
1. 换库
2. 需要删除很多个应用的migrations文件夹
python manage.py migrate myapp --fake
"""
扩展表之后发生的变化:
1. 原来的auth_user表不存在了,换成你自己新建的表名了
2. 原来的auth_user表中的字段还都在,然后多了自己扩展的字段
3. 继承的类要发生改变AbstractUser
4. 在配置文件中加入下面一句话:
AUTH_USER_MODEL = 'app01.UserInfo'
AUTH_USER_MODEL = '应用名.类名'
5. 扩展之后还是按照原来的auth_user表使用
6. auth模块中的数据还是你扩展的表
7. 扩展之前别迁移.
"""