Django用户认证组件
用户认证
主要分两部分:
1.auth模块
from django.contrib import auth
2.User对象
from django.contrib.auth.models import User
用户认证组件key:
1.大前提:针对的是django自带的auth_user表
2.django下的auth_user 表创建用户
3.request.user
用户(user_obj)登录成功后:
auth.login(request,user_obj)做了以下几件事:
(1)过程赋值 request.user=user_obj
(2)request.session["user_id"]=user_obj.pk ,将此项信息注入到session表中,session_data 加了一个键值对user_id=user_obj.pk
做了3件事:
1.创建一把session 钥匙 session_key = 随机字符串
2.把这条记录放进seesion表中
3.返回钥匙给浏览器
4.每次请求request都是重新构建的,但AuthenticationMiddleware 这个中间件,在每次客户端发请求过来时做了一下几件事:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
(1)读session_key 钥匙,在到session表中,找 session_id对应的值 ,找到对应的id后再去auth_user表中获取该用户对象,并做赋值操作:request.user=找到的用户对象
(2)没有找到就用匿名用户对象 : request.user=匿名用户对象
auth模块
from django.contrib import auth
from
django.contrib.auth
import
authenticate, login ,logout
1.authenticate()
user_obj=authenticate(username=someone_username,password=someone_password)
1.验证用户名或密码是否正确
2.正确就返回用户对象,不正确则返回none
2.login(request,user_obj)
登录成功后:
login(request,user_obj)
再重定向到指定页面
3.logout
def logout_view(request):
logout(request)
再重定向到登录页面
logout(request) 大致做了以下几件事:
1. request.session.flush()
2.request.user=AnonymouseUser() #赋值给匿名用户对象
User 对象
User对象属性: username,password (必填),密码是加密的。
1、user对象的 is_authenticated()
1.request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name
要求:
1 用户登陆后才能访问某些页面
2 如果用户没有登录就访问该页面的话直接跳到登录页面
3 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址
#方法一 (非装饰器) def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path)) #方式二(装饰器)
from django.contrib.auth.decorators import login_required @login_required
def my_view(request):
@login_request装饰器的详解
auth_user对象(request.user)的API: request.user.id 判断是否登录过
request.user.is_authenticated() #判断是否登录过
装饰器:@login_required 有从哪来回哪去功能
django.contrib.auth.decorators import login_required
如:
1.没有登录就访问books页面,@login_required会给用户重定向到登录页面
2.同时,跳转到登录页面默认地址 127.0.01:8000/account/login/?next=/books/ ;
因为global_settings 中默认:"/account/login/"
from django.conf import global_settings
LOGIN_URL="/account/login/"
,可以在项目的配置文件settings中修改该参数值:
LOGIN_URL="/login/" @login_request装饰器实现从哪来到哪去的功能细节:
地址栏数据部分:?next=/books/ 在后端可以通过 nex_path =request.GET.get("next") or "/books/"获取到,登录成功后直接重定向到该地址nex_path
nex_path =request.GET.get("next") or "/books/" 说明: 1.如果用户是直接选择login页面直接登录访问时,request.GET.get("next")的返回值就为None,
所以这时redirect(None),会报错,所以这种情况让它重定向到books页面就好。
2.如果用户不是直接选择login页面,而是直接访问其他需要先登录后才能访问的页面,就回到登录页面,登录成功后,重从定向的页面路径获取:
nex_path =request.GET.get("next")
所以在登录视图函数中(非装饰器login视图函数,模拟装饰器@login_required实现登录成功后,跳转到之前的访问页面):
def login(request):
if request.method=="GET":
return render(request,"login.html")
else:
user_obj=auth.authenticate(username=user,password=pwd) #查询是否有该对象,有就返回or返回none
if user_obj:
#登录成功
auth.login(request,user_obj)
#print(request.path)
#print(request.get_full_path())
#注意如果前端用的是ajax提交请求时,注意ajax中的url,需要时空,默认提交到本页面,不要指定login页面,否则获取不到
next_path 的路径
next_path=request.GET.get("next") or "/books/" #next_path 表示之前的访问页面地址,如何是直接访问login页面则重定向到books页面
return redirect(next_path) else:
return redirect("/login/")
对@login_request 装饰器的使用需要注意点:
到项目的settings配置文件中添加一个键值对:LOGIN_URL="/login/" , 否则默认为:LOGIN_URL="/account/login/"
2.创建用户
auth_user表中创建用户: #auth_user 表:
from django.contrib.auth.models import User
User.objects.create(username="egon",password="") #这种方式创建的用户密码也是明文的
User.objects.create_user(username="alex",password="")#密文
User.objects.create_superuser(username="taibai",password="",email="122323223@qq.com")#密文,创建superuser时,需要email
3.核对密码:check_password(passwd)
用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回
True
4.修改密码 :set_password()
user = User.objects.get(username='')
user.set_password(password='')
user.save
示例:
1.注册:
def sign_up(request): state = None
if request.method == 'POST': password = request.POST.get('password', '')
repeat_password = request.POST.get('repeat_password', '')
email=request.POST.get('email', '')
username = request.POST.get('username', '')
if User.objects.filter(username=username):
state = 'user_exist'
else:
new_user = User.objects.create_user(username=username, password=password,email=email)
new_user.save() return redirect('/book/')
content = {
'state': state,
'user': None,
}
return render(request, 'sign_up.html', content)
2.修改密码:
@login_required
def set_password(request):
user = request.user
state = None
if request.method == 'POST':
old_password = request.POST.get('old_password', '')
new_password = request.POST.get('new_password', '')
repeat_password = request.POST.get('repeat_password', '')
if user.check_password(old_password):
if not new_password:
state = 'empty'
elif new_password != repeat_password:
state = 'repeat_error'
else:
user.set_password(new_password)
user.save()
return redirect("/login/")
else:
state = 'password_error'
content = {
'user': user,
'state': state,
}
return render(request, 'set_password.html', content)
Django用户认证组件的更多相关文章
- web框架开发-Django用户认证组件
可以用认证组件做什么 针对session的缺陷, 跟新数据时,不跟新key键, 用户认证组件是删除后再重建 用户认证组件很多功能可以直接使用 利用用户认证表(auth_user,通过Django自己创 ...
- 10.Django用户认证组件
用户认证组件: 功能:用session记录登录验证状态: 前提:用户表,django自带的auth_user 创建超级用户:python manage.py createsuperuser ...
- django——用户认证组件
用户认证 auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...
- Django之路——11 Django用户认证组件 auth
用户认证 auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...
- django - 总结 - 用户认证组件
用户认证组件 from django.contrib import auth 从auth_user表中获取对象,没有返回None,其中密码为密文,使用了加密算法 user = auth.authent ...
- python 全栈开发,Day79(Django的用户认证组件,分页器)
一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...
- django的用户认证组件
DataSource:https://www.cnblogs.com/yuanchenqi/articles/9064397.html 代码总结: 用户认证组件: 功能:用session记录登录验证状 ...
- 06 django的用户认证组件
1.用户认证组件 用户认证组件: 功能:用session记录登录验证状态 前提:用户表:django自带的auth_user 创建超级用户: python3 manage.py createsuper ...
- Django组件 - cookie、session、用户认证组件
一.cookie 1.会话跟踪技术 1)什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话 ...
随机推荐
- Newcoder 华华给月月出题(线筛)题解
题目描述: 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: Ans=⊕Ni=1(iNmod(109+7))Ans=⊕i=1N(iNmod(109+7)) ⊕⊕符 ...
- 【问题解决:时区】连接MySQL时错误The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone
问题描述: MySQL升级到8.0.11之后连接数据库报错: Your login attempt was not successful, try again. Reason: Could not g ...
- SSM项目开发中的实体定义以及MySQL表格设计
话不多说,下面表格是项目开发中用到的实体集以及表格Name 实体创建 表格创建 Area 区域 Area 实体 areaId areaName priority createTime last ...
- LOJ6283 数列分块入门7(分块)
pushdown的addtag[x]打成addtag[i],结果WA了一次 #include <cstdio> #include <algorithm> #include &l ...
- Cisco 2960交换机配置
一. 基本操作 Switch(config)#hostname test01(交换机名称) //全局模式下修改交换机名称 Switch(config)#enable secret 123456 //全 ...
- 利用C#实现AOP常见的几种方法详解
利用C#实现AOP常见的几种方法详解 AOP面向切面编程(Aspect Oriented Programming) 是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 下面这篇文章主要 ...
- 教你用ActiveReports分析京东双十一数据的价值
随着双十一购物盛会落下帷幕,各大电商平台纷纷公布出自己今年的成绩.与其它同行不同的是,京东除了公布1598亿的线上下单金额,还公布了线上线下融合的战果. 面对京东线上.线下海量数据源,我们该如何进行整 ...
- appium长按按钮
public static AndroidDriver driver; /长按操作:waitAction的参数单位是ms/ public static void longClick(String id ...
- Jmeter工具
开源,纯java,用于HTTP协议性能测试,接口协议测试工具,自动化测试工具 功能测试角度: 1.支持多种不同类型的协议.接口协议有多种 2.可以全面支持HTTP协议(后台交互) 3.其他非直接支持的 ...
- Java单例设计模式(实现Java的一个类只有一个对象)
单例设计模式的定义:单例设计模式是一种软件设计模式,在它的核心包含一个称为单例类的核心类. 核心便是希望一个类只有一个对象. 如何实现类在内存中只有一个对象呢? 第一步:构造私有:第二步:本身提供一 ...