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打个电话 ...
随机推荐
- POJ 1251 + HDU 1301 Jungle Roads 【最小生成树】
题解 这是一道裸的最小生成树题,拿来练手,题目就不放了 个人理解 Prim有些类似最短路和贪心,不断找距当前点最小距离的点 Kruskal类似于并查集,不断找最小的边,如果不是一棵树的节点就合并为一 ...
- bzoj1497 [NOI2006]最大获利 最大权闭合子图
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1497 思路 最大权闭合子图的裸题 一开始知道是这个最大权闭合子图(虽然我不知道名字),但是我 ...
- loj SDOI2017数字表格
目录 太才了 注意,错误 代码 太才了 \(\prod \limits_{i=1}^{n}\prod\limits_{j=1}^{m}f[gcd(i,j)]\) \(\prod\limits_{k=1 ...
- R语言之正则表达式
常见与正则表达式相关的函数: grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, use ...
- Nand flash code
(1)流水灯 1>我们来看原理图 2>datasheet 3> ...
- 【C#】神奇的yeild
直接出栗子: class Program { static void Main(string[] args) { foreach (var item in FilterWithoutYield) { ...
- Seletct2
doc 博客: 基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用 <div class="span4 channelSearch&qu ...
- HDU 1241 Oil Deposits(石油储藏)
HDU 1241 Oil Deposits(石油储藏) 00 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Probl ...
- 用 Anaconda 完美解决 Python2 和 python3 共存问题
Python3 被越来越多的开发者所接受,同时让人尴尬的是很多遗留的老系统依旧运行在 Python2 的环境中,因此有时你不得不同时在两个版本中进行开发,调试. 如何在系统中同时共存 Python2 ...
- list转化为json数组
今天做项目,用Thrift获取数据,在servlet里面获取的是数组,但是通过Ajax传输到js文件里是一个list,我获取长度失败,这个时候需要将list转化为json数组,我们可以通过eval() ...