011---Djang的cookie和session
-------------------------------------------------------------cookie与session----------------------------------------------------------
前面已经说过http协议无法保存状态,但是实际使用场景,我们又却要保存状态,因此cookie就诞生了,会话跟踪技术。
定义:保存在浏览器本地的key value(键值对)。类似python的字典。翻译成中文就是小饼干的意思。
工作原理:由服务器产生内容,浏览器收到响应后保存在本地,当浏览器再次访问时,浏览器会自动携带cookie,服务器就能判断这个是谁了。
发展:虽然一定程度上解决了'保持登录的状态',但是cookie本身最大只支持4096b,而且cookie是保存在浏览器本地的,有些用户敏感内容、私密信息存起来也不好,随时可拦截和窃取。因此就需要一种新的东西,
支持更大的字节。且不是保存在浏览器本地,而是保存在服务器。有较高的安全性,它就是session。
注意:
session和cookie不限于django。不限于语言和框架。其实是共通性的东西。
不同浏览器无法共享cookie,也就是换个浏览器,cookie是不一样的。
多次登录,同一个浏览器的cookie会覆盖之前的记录
先来写一个cookie版的登录
视图部分:
def login(request):
if request.method == "POST":
user = request.POST.get('user') # 获取用户名
pwd = request.POST.get('pwd') # 获取密码
user = models.UserInfo.objects.filter(name=user, pwd=pwd).first() # 数据库查找 # 如果有这个用户
if user:
# 登录成功
# 创建响应对象:HttpResponse() or render(request,...) or redirect() 三个都可以
response = HttpResponse('ok') # 设置cookie
response.set_cookie('is_login', True) # 浏览器保存形式:{"is_login":true}
response.set_cookie('user', user.name, ) # 浏览器保存形式:{"user":用户的名字}
return response return render(request, 'login.html')
模版部分:
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body> <form action="" method="post">
{% csrf_token %}
用户名:<input type="text" name="user">
密码:<input type="password" name="pwd">
<input type="submit" value="登录"> </form>
</body>
</html>
再写一个index视图。如果不设置cookie的话,用户是可以直接访问的。
视图部分:
def index(request):
# 获取cookie
is_login = request.COOKIES.get('is_login')
name = request.COOKIES.get('user') # 如果is_login为空,重定向到login页面
if not is_login:
return redirect('/login/')
# 登录成功就返回index页面
return render(request, 'index.html', {"username": name})
模版部分:
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body> <h1>this is index</h1>
<h3>Hello {{ username }}</h3>
<p>上次登录时间:{{ last_time }}</p> <a href="/logout_session/">注销</a>
</body>
</html>
先不登录访问index一下:
可以看到自动跳转到login页面了。因为没登陆,获取不到cookie。
现在登陆:
登录成功后
可以看到浏览器保存了cookie 再次访问index
写注销视图logout
def logout(request):
response = redirect('/login/')
# 清除cookie
response.delete_cookie(key='is_login')
return response
访问/logout/后,会自动跳转到logim登录页面
再此访问index。cookie清理了。会自动跳转到login登录。 session版登录
视图部分:
基本和cookie一样就是设置的方式不一样
def login_session(request):
if request.method == 'POST':
username = request.POST.get('user')
pwd = request.POST.get('pwd')
user = models.UserInfo.objects.filter(name=username, pwd=pwd).first()
if user:
request.session['is_login'] = True
request.session['username'] = username
'''
三步:
如果已经访问过一次,有session_id就是更新操作。并不是登录一次创建一次,并不是创建
、服务器生成一个随机字符串xxx
、response.set_cookie('session_id','xxx')
、在django_session表中创建一条记录:
session-key session-data 过期时间
xxx {'is_login':True,'username':username}
''' return HttpResponse('登录成功')
return render(request, 'login.html')
index视图
def index_session(request):
is_login = request.session.get('is_login')
print(is_login)
'''
、request.COOKIES.get('session_id') # 得到随机字符串
、在django-session表中过滤记录
obj = django-session.objects.filter(session-key=xxx).first()
、obj.session-data.get('is_login')
'''
if is_login:
username = request.session.get('username')
last_time = request.session.get('last_time')
return render(request, 'index.html', {"username": username, "last_time": last_time})
return render(request, 'login.html')
logout注销视图
def logout_session(request):
response = redirect('/login_session/')
request.session.flush() # 删除当前会话的数据和cookie
return response
总结:
cookie:
、设置cookie response.set_cookie(key,value)
、读取cookie request.COOKIES.get(key)
、删除cookie response.delete_cookie(key) 设置和删除都是response 读取是request session
、设置:request.session[key]=value
、读取:request.session.get(key)
、删除:request.session.flush() 都是request
011---Djang的cookie和session的更多相关文章
- Djang之cookie和session
一 会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器 ...
- cookie和session django中间件
目录 一.cookie和session 1. 为什么要有cookie和session 二.cookie 1. 什么是cookie 2. django中关于cookie的使用 (1)后端设置cookie ...
- Cookie和Session的总结
1.开篇 在之前学习这一段的时候我一直有点没弄清楚,其实对Session这块的理解还可以,但是Cookie感觉始终还是欠缺点火候.之后的很长一段时间都基本上很少用Cookie了,渐渐的也淡忘了这一块的 ...
- java的会话管理:Cookie和Session
java的会话管理:Cookie和Session 1.什么是会话 此处的是指客户端(浏览器)和服务端之间的数据传输.例如用户登录,购物车等 会话管理就是管理浏览器客户端和服务端之间会话过程产生的会话数 ...
- Cookie和Session的那些事儿
Cookie和Session都是为了保持用户的访问状态,一方面为了方便业务实现,另一方面为了简化服务端的程序设计,提高访问性能.Cookie是客户端(也就是浏览器端)的技术,设置了Cookie之后,每 ...
- django的cookie和session以及内置信号、缓存
cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...
- Cookie和Session的区别
前言 HTTP是一种无状态的协议,为了分辨链接是谁发起的,就需要我们自己去解决这个问题.不然有些情况下即使是同一个网站我们每打开一个页面也都要登录一下.而Session和Cookie就是为解决这个问题 ...
- 本地数据Store。Cookie,Session,Cache的理解。Timer类主要用于定时性、周期性任务 的触发。刷新Store,Panel
本地数据Store var monthStore = Ext.create('Ext.data.Store', { storeId : 'monthStore', autoLoad : false, ...
- Cookie与Session
再说Cookie与Session之前,先要了解一下http协议. 何为http协议: http协议即超文本传输协议,一种基于浏览器请求与服务器响应的协议,该协议主要的特点就是它是一种无状态的协议(只针 ...
- 【转】Cookie和Session区别和联系详解
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
随机推荐
- 粗看ES6之字符串
标签: javascript es6 字符串新增特性 新增二个方法 - startsWith/endsWith 字符串模板 - 反单引号的应用 startsWith 判断字符串以是否以某某开头,返回一 ...
- Redis入门--(二)Redis的概述
1.Redis的由来 创始人觉得Mysql不好用,就自己写了: 国内使用Redis的网站有新浪微博,知乎: 国外GitHub: VMWare也支持redis的开发 2.Redis的概述 官方提供的测试 ...
- 如何在K3 WISE BOS集成开发工具中自定义字段过滤条件
1.结论 对于输入过滤条件后BOS报“列名不正确”的过滤条件,要在列名前增加x2标识 无效的过滤 FNumber ,,,,,) 正确的过滤 x2.FNumber ,,,,,) 2.完全可以不看的探索过 ...
- Active Sync与IIS7 Classic&Integrated模式,Exchange 2007&2010的关系
上周开始一项工作,起因是因为QA同事发现我们开发的EAS hook不能在Exchange 2007 server上工作,而在Exchange 2010上可以正常工作. 环境对比如下: 1. Windo ...
- Spark Streaming与Kafka集成
Spark Streaming与Kafka集成 1.介绍 kafka是一个发布订阅消息系统,具有分布式.分区化.多副本提交日志特点.kafka项目在0.8和0.10之间引入了一种新型消费者API,注意 ...
- 磁盘空间满了之后MySQL会怎样
大多数用户在对于磁盘进行分区的时候都是习惯性的不给系统盘预留很大空间,其实这并不是一个好习惯.因为系统分区并不像我们想象的那样会仅仅安装一个操作系统,系统分区多数还是会承载操作系统主要应用软件安装任务 ...
- TP5.1:实现分页
前提: (1)为了让分页变得更加好看,我的案例加载了bootstrap和jq的文件,具体操作请参考:http://www.cnblogs.com/finalanddistance/p/9033916. ...
- 宝塔linux面板,修改root密码
root,密码忘记了.但宝塔vps的密码没忘记... 翻完宝塔linux面板都没看到有修改系统root密码的选项,后来尝试定时任务shell,也没成功, 最终快绝望的时候,发现通过添加插件成功修改密码 ...
- caffe RandomOrderChannels
就是将rgb图的3个channel随机打乱顺序,给定一个概率值是否执行这个操作,v系列模型的概率一般都设置的为0 void RandomOrderChannels(const cv::Mat& ...
- cudaMallocPitch()