day061 cookie和session
一. cookie
1.cookie 的原理

- 工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,
- 浏览器收到相应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,
- 这样服务器就能通过Cookie的内容来判断这个是“谁”了。
- 解决http协议的无状态,使服务器和客户端保持回话
特性:
1. 保存浏览器本地
2. 服务器让浏览器进行设置的,浏览器也有权不设置
3. 下次访问服务器时自动携带相应的cookie
Cookie规范
- Cookie大小上限为4KB;
- 一个服务器最多在客户端浏览器上保存20个Cookie;
- 一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器

2.cookie 操作
①设置 cookie

- rep = HttpResponse(...)
- rep = render(request, ...)
- rep.set_cookie(key,value,...)
- rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
参数:
key, 键
value='', 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
secure=False, https传输
httponly=False 只能http协议传输,无法被JavaScript获取
(不是绝对,底层抓包可以获取到也可以被覆盖)

② 获取cookie

- request.COOKIES['key']
- request.COOKIES.get(key)
- #加盐
- request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
default: 默认值
salt: 加密盐
max_age: 后台控制过期时间

③ 删除 cookie
- def logout(request):
- rep = redirect("/login/")
- rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
- return rep
④示例:

- from django.shortcuts import render,HttpResponse,redirect
- from app01 import models
- from django.urls import reverse
- # Create your views here.
- def login(request):
- if request.method == 'GET':
- return render(request,'login.html')
- else:
- name = request.POST.get('name')
- password = request.POST.get('password')
- retu = models.name_pwd.objects.filter(name=name,password=password)
- if retu.exists():
- ret = redirect(reverse('home'))
- ret.set_cookie('is_login', True) #设置cookie
- ret.set_cookie('user', name)
- return ret
- else:
- return redirect(reverse('login'))
- def home(request):
- is_login = request.COOKIES.get('is_login',False)
- #获取cookie
- if is_login != 'True':
- return redirect(reverse('login'))
- else:
- return render(request,'home.html')

二. session
1.session原理(基于cookie)

- Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建
- 一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资
- 源再从用户各自的session中 取出数据为用户服务。

2.操作

- 注意:这都是django提供的方法,其他的框架就需要你自己关于cookie和session的方法了。
- # 获取、设置、删除Session中数据
- #取值
- request.session['k1']
- request.session.get('k1',None) #request.session这句是帮你从cookie里面将sessionid的值取出来,将django-session表里面的对应sessionid的值的那条记录中的session-data字段的数据给你拿出来(并解密),get方法就取出k1这个键对应的值
- #设置值
- request.session['k1'] = 123
- request.session.setdefault('k1',123) # 存在则不设置
- #帮你生成随机字符串,帮你将这个随机字符串和用户数据(加密后)和过期时间保存到了django-session表里面,帮你将这个随机字符串以sessionid:随机字符串的形式添加到cookie里面返回给浏览器,这个sessionid名字是可以改的,以后再说
- #但是注意一个事情,django-session这个表,你不能通过orm来直接控制,因为你的models.py里面没有这个对应关系
- #删除值
- del request.session['k1'] #django-session表里面同步删除
- # 所有 键、值、键值对
- request.session.keys()
- request.session.values()
- request.session.items()
- # 会话session的key
- session_key = request.session.session_key 获取sessionid的值
- # 将所有Session失效日期小于当前日期的数据删除,将过期的删除
- request.session.clear_expired()
- # 检查会话session的key在数据库中是否存在
- request.session.exists("session_key") #session_key就是那个sessionid的值
- # 删除当前会话的所有Session数据
- request.session.delete()
- # 删除当前的会话数据并删除会话的Cookie。
- request.session.flush() #常用,清空所有cookie---删除session表里的这个会话的记录,
- 这用于确保前面的会话数据不可以再次被用户的浏览器访问
- 例如,django.contrib.auth.logout() 函数中就会调用它。
- # 设置会话Session和Cookie的超时时间
- request.session.set_expiry(value)
- * 如果value是个整数,session会在些秒数后失效。
- * 如果value是个datatime或timedelta,session就会在这个时间后失效。
- * 如果value是0,用户关闭浏览器session就会失效。
- * 如果value是None,session会依赖全局session失效策略。
- session相关配置: from django.conf import global_settings

3.示例

- def login(request):
- if request.method == 'GET':
- return render(request,'login.html')
- else:
- username = request.POST.get('name')
- password = request.POST.get('password')
- retu = models.name_pwd.objects.filter(name=username, password=password)
- if retu.exists():
- request.session['is_login']=True #添加值
- request.session['user']=username #添加值
- '''
- 1 生成一个sessionid 随机字符串
- 2 将它保存到django-session表里面,
- session_key --- sessionid 随机字符串
- session_data --- 加密的用户数据{'username':username,'password':password}
- 3 给了cookie返回给了浏览器
- '''
- return redirect(reverse('home'))
- else:
- return redirect(reverse('login'))
- def home(request):
- ret = request.session.get('is_login') #取值
- '''
- request.session
- 1 从cookie中取出sessionid 的 值
- 2 去django_session表里面找到这个sessionid的值对应的那条数据
- 3 反解密
- '''
- if ret != True:
- return redirect(reverse('login'))
- else:
- username = request.session.get('user') #取值
- return render(request, 'home.html', {'username': username})
- def logout(request):
- request.session.flush() #常用,清空所有cookie---删除session表里的这个会话的记录
- return HttpResponse('OK')

4.django中的session设置

- 1. 数据库Session
- SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
- 2. 缓存Session
- SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
- SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存, 也可以是memcache),此处别名依赖缓存的设置
- 3. 文件Session
- SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
- SESSION_FILE_PATH = None # 缓存文件路径,如果为None, 则使用tempfile模块获取一个临时地址tempfile.gettempdir()
- 4. 缓存+数据库
- SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
- 5. 加密Cookie Session
- SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
- 其他公用设置项:
- SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key, 即:sessionid=随机字符串(默认)
- SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
- SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
- SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
- SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
- SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
- SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
- SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

三.装饰器添加
在views.py文件中添加多个页面的验证

- def wrapper(fn):
- def inner(request,*args ,**kwargs):
- is_login = request.COOKIES.get('is_login', False)
- if is_login != 'True':
- return redirect(reverse('login'))
- else:
- ret=fn(request)
- return ret
- return inner
- @wrapper
- def home(request):
- return render(request,'home.html')

注: FBV , CBV 中 cookie ,session的添加原理都相同
5. 配置
from django.conf import global_settings
day061 cookie和session的更多相关文章
- 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通过在服务器端 ...
- 理解Cookie和Session机制(转)
目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...
随机推荐
- Handler使用小结
个人概念里面handler用来更新UI.一直有一个问题困恼我,为什么我在主线程里面创建一个Handler不需要传递传递Looper,而在一个子线程里面必须调用Looper.prepare, Loope ...
- java基础知识—类的方法
1.定义类方法的语法: 访问修饰符 返回值类型 方法名(){ 方法体: } 2.方法名的规范: 1.必须以字母下划线·“—”或“$”开头 2.可以有数字,但不能以数字开头. 3.如果方法名是以多个单词 ...
- 自学python之路(day5)
一.文件操作1. 只读1) r 以str形式 f = open('d:\文件操作.txt',mode='r',encoding='utf-8') # r是默认的 content=f.read() pr ...
- 2018-2019-2 学号20175223 实验二《Java面向对象程序设计》实验报告
目录 北京电子科技学院(BESTI)实验报告 实验名称:实验二 面向对象程序设计 实验内容.步骤与体会: 一.实验二 面向对象程序设计-1 二.实验二 面向对象程序设计-2 三.实验二 面向对象程序设 ...
- mysql 5.7安装图解 mysql 5.7图文安装完整教程
今天给搭建分享一个教程,mysql 5.7的安装操作,这里呢我叫大家怎么用二进制去安装mysql,其实在大多数的生产环境中使用二进制预编译的安装方式是最多了,下面大家跟着我的步骤去尝试着安装下吧. 先 ...
- 泊爷带你学go -- 加锁的问题
package main import ( "fmt" "sync" ) var l sync.Mutex var a string func f() { a ...
- java面向对象编程(九)--final
1.final概念 final可以修饰变量或者方法.在某些情况下,程序员可能有以下需求: a.当不希望父类的某个方法被子类覆盖(override)时,可以用final关键字修饰. b.当不希望类的某个 ...
- 树莓派外网ssh访问holer实现篇
外网ssh访问树莓派 内网的树莓派(Raspberry Pi),只能在局域网内访问,怎样从公网也能ssh登录访问树莓派? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安装并启动树 ...
- 搞Java
上班之余,开始研究Java了. 想想从三月份开始自己啃书以来,Spring+Mybatis+公司框架的用法,基本都是速成来的,还是有些恐惧的. Spring万般爽,annotion用的很舒服,但还是想 ...
- ejabberd之开题篇
ejabberd是基于Jabber/XMPP协议的即时通讯服务器.采用Erlang/OTP开发.它的特点是,跨平台,容错,集群和模块化. 因为自己本身是基于erlang工作,而且听到有不少的公 ...