django组件-cookie与session
会话跟踪技术
在一个会话的多个请求中共享数据,这就是会话跟踪技术。例如在一个绘画中的请求如下:
请求银行主页:
- 请求登陆(请求参数是用户名和密码);
- 请求转账(请求参数与转账相关的数据);
- 请求信誉卡还款(请求参数与还款相关的数据)
我们必须在一个会话过程中有共享数据的能力
我们知道HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪!在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术。
Cookie
Cookie是key-value结构,类似于一个python中的字典,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。
当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了。
- Cookie大小上限为4KB;
- 一个服务器最多在客户端浏览器上保存20个Cookie;
- 一个浏览器最多保存300个Cookie;
以上数值不定
如果服务端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务端发送的Cookies是:Set-Cookie:a=A;第二请求服务端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA.
设置Cookie:
1 rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect() 2 3 rep.set_cookie(key,value,...) 4 rep.set_signed_cookie(key,value,salt='加密盐',...)
属性:
1 ''' 2 class HttpResponseBase: 3 4 def set_cookie(self, key, 键 5 value='', 值 6 max_age=None, 超长时间 7 cookie需要延续的时间(以秒为单位) 8 如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止。 9 10 expires=None, 超长时间 11 expires默认None ,cookie失效的实际日期/时间。 12 13 14 path='/', Cookie生效的路径, 15 浏览器只会把cookie回传给带有该路径的页面,这样可以避免将 16 cookie传给站点中的其他的应用。 17 / 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 18 19 domain=None, Cookie生效的域名 20 21 你可用这个参数来构造一个跨站cookie。 22 如, domain=".example.com" 23 所构造的cookie对下面这些站点都是可读的: 24 www.example.com 、 www2.example.com 25 和an.other.sub.domain.example.com 。 26 如果该参数设置为 None ,cookie只能由设置它的站点读取。 27 28 secure=False, 如果设置为 True ,浏览器将通过HTTPS来回传cookie。 29 httponly=False 只能http协议传输,无法被JavaScript获取 30 (不是绝对,底层抓包可以获取到也可以被覆盖) 31 ): pass 32 33 '''
获取Cookie:
1 request.COOKIES
删除Cookie:
1 response.delete_cookie("cookie_key",path="/",domain=name)
session
session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所有用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其他web资源时,其他web资源再从各自的session中取出数据为用户服务。
语法
1 1、设置Sessions值 2 request.session['session_name'] ="admin" 3 2、获取Sessions值 4 session_name = request.session["session_name"] 5 3、删除Sessions值 6 del request.session["session_name"] 7 4、flush() 8 删除当前的会话数据并删除会话的Cookie。 9 这用于确保前面的会话数据不可以再次被用户的浏览器访问