auth模块
auth模块方法及使用
主要分为登录认证, 保存用户状态, 判断当前用户是否登陆, 获取当前登陆用户, 登录认证装饰器, 密码核对, 修改密码, 注销当前登录用户, 注册.
1. 登录认证
首先需要导入模块:
from django.contrib import auth
# 登录认证: 比对用户名和密码是否正确 ''' 效验成功返回用户对象. 效验失败返回None. 注意: request可以不指定默认就是None, 而括号内必须同时传入用户名和密码. 不能只指定一个. ''' user_obj = auth.authenticated(request, username=username, password=password) print(user_obj) # jason 提示: 返回用户对象, 只是内部书写了__str__烦伐. 如果数据不符合则返回None print(user_obj.username) # jason print(user_obj.password) # pbkdf2_sha256$36000$zeNDf8CkZj7y$b+e/CjzZoAnbBIpvUWgz25ybBDqDzRTmYAHPytxqRYQ=
2. 保存用户状态
# 保存用户状态: ''' 1. 内部自动查找auth_user标签 2. 内部自动给密码加密再比对 提示: 只要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象 ''' auth.login(request, user_obj) # 内部调用的就是 request.session['key']=user_obj
3. 判断当前用户是否登陆
# 判断当前用户是否登陆: request.user.is_authenticated()
4. 获取当前登陆用户
# 获取当前登陆用户: ''' 1. 获取浏览器提交过来的sessionid对应的随机字符串 2. 后端拿到随机字符串到django_session表中获取数据 2-1. 如果浏览器提交的随机字符串没有匹配上. 返回 AnonymousUser 匿名用户 2-2. 如果浏览器提交的随机字符串有匹配上了. 返回对应的用户对象 ''' request.user # 匹配上返回对应用户对象. 没有匹配上返回 AnonymousUser 对象
5. 登录认证装饰器
# 登录认证装饰器: from django.contrib.auth.decorators import login_required # 局部设置 @login_required(login_url='/login/') # login_url 控制跳到指定的页面. 否则会以accounts打头, 跟随你的登录页面路径/login/?next=/my_home/ # 全局设置 到settings.py中书写: LOGIN_URL = '/login/' @login_required # 之后的装饰器使用就不需要传login_url参数了 # 优先级: 局部 > 全局 # 局部优缺点: 缺点: 如果争对需要装饰的对象都是在没有登录以后跳转到同一个页面代码就会显得冗余 . 优点: 不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面 # 全局优缺点: 缺点: 跳转的页面却很单一 优点: 全局的好处在于无需重复写代码
6. 密码核对
# 密码核对: 比对原密码 ''' 会将old_password加密与原密码比对. 返回布尔值. ''' is_correct = request.user.check_password(old_password)
7. 修改密码
# 修改密码: ''' 第一步仅仅是在修改对象的属性 第二步才是真正的操作数据进行保存 ''' request.user.set_password(new_password) request.user.save()
8. 注销当前登录用户
# 注销当前登录用户: auth.logout(request) # 内部使用的就是 request.session.flush()
9. 注册
# 注册: from django.contrib.auth.models import User # 操作auth_user表写入数据 # 方式一: 密码无加密. 不推荐使用 User.object.create(username=username, password=password) # 方式二: 创建普通用户. 密码会进行加密 User.object.create_user(username=username, password=password) # 方式三: 超级用户创建(了解). 密码会进行加密. 代码创建的email必填. 命令行创建的可以不填 User.object.create_superuser(username=username, password=password, email='111@qq.com')
总结
# auth模块前戏 # 本质: auth模块本质就是在执行完数据库迁移命令以后, 操作django自动生成的auth_user表. django的admin后台管理需要用到该表 # 命令行创建超级用户: python3.6 manage.py createsuperuser # auth模块方法及使用 # auth模块主要提供了登录认证, 保存用户状态, 判断当前用户是否登陆, 获取当前登陆用户, 登录认证装饰器, 密码核对, 修改密码, 注销当前登录用户, 注册等功能 # 登录认证 from django.contrib import auth user_obj = auth.authenticate(request, username=username, password=password) # 认证成功返回用户对象, 否则返回None # 存储用户状态 提示: 该方法执行完毕之后,在任意位置都可以通过request.user获取到当前登陆的用户对象 auth.login(username=username, password=password) # 内部就是操作request.session[key]=user_obj # 获取当前用户对象 request.user # 判断当前用户是否登录 request.user.is_authenticated() # 登录认证装饰器 from django.contrib.auth.decorators import login_required # 局部 @login_required(login_url='/login/') @login_required(login_url='/this_login/') # 全局 先到settings.py配置文件中配置: LOGIN_URL = '/login/' @login_required # 优先级: 局部 > 全局 # 效验密码 is_correct = request.user.check_password(old_password) # 效验结果是布尔值 # 修改密码 request.user.set_password(new_password) request.user.save() # 注册 from django.contrib.auth.models import User User.objects.create(username=username, password=password) # 密码无加密 , 不推荐使用 User.objects.create_user(username=username, password=password) # 创建普通用户 User.objects.create_superuser(username=username, password=password, email='111@qq.com') # 创建管理员用户, 与命令行创建方式不同的是, 必须指定邮箱 # 注销 auth.logout(request)