一: 会话技术:
1: 什么是会话跟踪技术:
首先我们应该知道, 什么是会话. 当浏览器 (客户端) 第一次访问某个网站的时候(服务器). 该浏览器便和服务器建立了单独的会话. 直到浏览器关闭或服务器断开. 但是一个网站有许多请求, 如 / login/,/index / 等, 而 http 协议是一种无状态的协议, 一次请求一次链接, 并不会保存状态信息. 而我们一些信息, 常常需要多个请求之间进行交互. 既然请求无法保存登陆信息, 那么可以使用会话跟踪技术来保存数据信息, 进而进行多个请求之间的数据互通. 实现会话跟踪技术就可以使用 cookie 和 session 来吗实现.
二: cookie
1: 什么是 cookie
cookie 是存在浏览器上的一种对象, 用于保存浏览器的一些用户信息, 比如登陆信息, 包括登陆状态, 上一次登陆时间.
优点: 在用户二次登陆的情况下, 可以的快速获取用户登陆状态.
缺点: 因为是保存在浏览器端所以安全性差
保存方式: 采用键值对的方式保存:{key:value,key:value}
2:djingo 的 cookie 实现
1: 设置 cookie
- def log_in(request):
- if request.method=='POST':
- user = request.POST.get('username')
- password = request.POST.get('password')
- if user == 'yjp' and password == 'abc':# 登陆验证成功
- obj = redirect('/index')
- obj.set_cookie('cookie_id','cookie_value')# 设置 cookie, 在浏览器存储{'cookie_id':'cookie_value'}
- return obj
- return render(request, 'login.html', locals())
2: 获取 cook
- def index(request):
- co =request.COOKIES.get('cookie_id',None)# 根据 cooke_id 获取 cookie
- if co :
- return render(request, 'index.html')# 存在 cookie 跳转首页
- return render(request, 'login.html')# 不存在 跳转登陆页
浏览器第一次请求, 携带一个空的 cookie, 服务器相应的时候, 往空的 cookie, 添加信息. 以后的每次请求都携带该 cookie.
3: 删除 cookie
response.delete_cookie("cookie_key",path="/",domain=name)
三: session
3.1: 什么是 session
session 和 cookie 的作用一样相似, 用来保存用户的状态信息. 通常保存在服务器上, 对用户而言, 不可见, 相对安全.
保存方式: 使用键值对的方式保存,{key:value,key:value}
优点: 相对于 cookie 较为安全.
缺点: 通常保存在数据库上, 每次保存数据都会进行数据库的读取或写入, 影响效率.
3.2:session 实现
- def log_in2(request):
- if request.method=='POST':
- user = request.POST.get('username')
- password = request.POST.get('password')
- if user == 'yjp' and password == 'abc':print('session',request.session)
- session=request.session
- session['verfiy'] ='is_login' #设置 cookie
- obj = redirect('/index')
- return obj
- return render(request, 'login.html', locals())
- def index2(request):
- co = request.session.get('verfiy', None)# 获取 cookie
- if co == 'is_login':
- return render(request, 'index.html')
- return render(request, 'login.html'
四: djingo 登陆验证, auth. 利用 cookie+session 的保存技术
4.1:cookie+session 保存过程
1: 浏览器第一次发送请求的时候, 发送一个空的 cookie, 服务器此时设置 session 如{'user':'yuan'}.
2: 当 session 设置成功后, 服务器会做两步操作. 一: 生成一个随机字符串, 并将该字符串当作当作 session_key,{'user':'yuan'}当作 session-data 存在数据库上.
第二步, 生成一个 cookie{'session_id':'随机字符串'}, 返回浏览器.
3: 浏览器下次发送请求的时候 cookie={'session_id':'随机字符串'}, 服务器拿到随机字符串, 当作 session_key, 在数据库中取出 session_data, 这样就完成了 session 值的传递.
4.2:auth 验证的代码实现
- from django.shortcuts import render,redirect,HttpResponse
- import random
- from django.contrib import auth #导入登陆验证的模块
- # Create your views here.
- from django.http import JsonResponse
- def index(request):
- if request.user: #判断用户是否存在
- print(request.user)
- return render(request,'index.html')
- else:
- return render(request,'login.html')
- def login(request):
- if request.method=='GET':
- return render(request,'login.html')
- if request.method=='POST':
- data={'user':None,'msg':None}
- print(request.POST)
- user =request.POST['user']
- pwd =request.POST['pwd']
- code =request.POST['code']
- if code.lower()==request.session['code'].lower():
- user=auth.authenticate(username=user,password=pwd)# 登陆验证, 验证用户登陆信息是否正确, 正确返回一个 user 已经验证通过的用户
- if user:
- auth.login(request,user)# 接受一个 request 对象和通过登陆验证 user, 并完成上面三步 cookie+session 的设置
- data['user']=True
- else:
- data['msg'] = '用户名或密码错误'
- else:
- data['msg']='验证码错误'
- return JsonResponse(data)
- def logout_view(request):
- auth.logout(request)# 注销用户
五: User 对象:
User 对象有两个属性 (user,password). 可以通过 request.user.is_authenticated() 来验证用户登陆是否通过验证, 通过验证返回 true.
验证后的怎么操作和该方法无关. 该方法只做验证这一个功能.
来源: http://www.bubuko.com/infodetail-2860466.html