Django-会话跟踪cookie和session

Django-会话跟踪cookie和session

HTTP协议 是短连接、且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态。

Cookie是来自服务端,保存在浏览器的键值对,主要应用于用户登录;

1.cookie

1.1Cookie的产生

HTTP协议是无状态的。

无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况,因此对于服务器来说每一次请求都是全新的,在会话中产生的数据并不会保存,为了保存数据Cookie应运而生。

1.2Cookie的原理

由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie。

1.3Cookie的格式

request.COOKIES['key']
request.sett_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
  • key:这个cookie的key。

  • value:这个cookie的value。

  • max_age=1 :cookie生效的时间,单位是秒

  • expires:具体过期日期

  • path=’/’:指定那个url可以访问到cookie;‘/’是所有; path=’/’

  • domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie

  • secure=False:https安全相关

  • httponly=False:限制只能通过http传输,JS无法在传输中获取和修改

1.4Cookie的操作

1.4.1创建

response创建

  • 不加盐
def cookie_set(request):
    response = HttpResponse('')
    response.set_cookie(key='xqb', value={'yy': '123123'}, max_age=20)
    print('-----------------------------------------------')
    return response
  • 加盐
def cookie_set(request):
    response = HttpResponse('')
    response.set_signed_cookie(key='xqb', value={'yy': '123123'}, max_age=20,salt='123')
    print('-----------------------------------------------')
    return response

1.4.2获取

request获取

  • 不加盐
def get_cookie(request):
    get_cookie_from_cookie = request.COOKIES.get('xqb')
    print(type(request.COOKIES.get('xqb')))
    return HttpResponse(get_cookie_from_cookie)
  • 加盐
def get_cookie(request):
    get_cookie_from_cookie = request.COOKIES.get('xqb',salt='123')
    print(type(request.COOKIES.get('xqb')))
    return HttpResponse(get_cookie_from_cookie)

1.4.2删除

使用delete_cookie来删除,实际上删除cookie就是将指定的cookie的值设置为空的字符串,然后使用将他的过期时间设置为0,也就是浏览器关闭后就过期。

def delete_cookie(request):
	response = HttpResponse("ok")
	response.delete_cookie("user_id")
	return response

2.session

2.1session的产生

cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患,

于是cookie+session出现了!我们可以 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串),

基于以上原因:cook+session组合就此代替了单单使用cookie做会话保持的方式

Session依赖Cookie!但与Cookie不同的地方在于Session将所有的数据都放在服务器端,用户浏览器的Cookie中只会保存一个非明文的识别信息,比如哈希值。

Session是大多数网站都需要具备的功能。Django为我们提供了一个通用的Session框架,并且可以使用多种session数据的保存方式:

  • 保存在数据库内
  • 保存到缓存
  • 保存到文件内
  • 保存到cookie内

通常情况,没有特别需求的话,请使用保存在数据库内的方式,尽量不要保存到Cookie内。

Django的session框架支持匿名会话,封装了cookies的发送和接收过程。cookie包含一个会话ID而不是数据本身(除非你使用的是基于后端的cookie)。

Django的会话框架完全地、唯一地基于Cookie。它不像PHP一样,把会话的ID放在URL中。那样不仅使得URL变得丑陋,还使得你的网站易于受到通过"Referer"头部进行窃取会话ID的攻击。

2.2.1session的创建

使用request

def set_session(request):
    request.session['user'] = 'rob'
    return HttpResponse('session 设置')

2.2.2session的获取

同样使用request

def get_session(request):
    get_session_data = request.session.get('user')
    return HttpResponse(get_session_data)

2.2.3删除

request.session.flush()

2.2.4删除session中的指定键及值

del request.session[‘key’]

2.2.5设置会话的超时时间 单位s

request.session.set_expiry(value):

  • 如果value是个datatime或timedelta,session就会在这个时间后失效。
  • 如果value是0,用户关闭浏览器session就会失效。
  • 如果value是None,session会依赖全局session失效策略

3.cookie和session的联系和区别

1.cookie和session都是会话技术,cookie是运行在客户端,session是运行在服务器端。

2.cookie由大小限制以及浏览器在存cookie的个数也是有限的,session是没有大小限制和服务器的内存大小有关。

3.cookie由安全隐患,通过拦截或本地找到cookie后可以进行攻击。

4.session是保存子服务器端上,存在一段时间才会消失,如果session过多会增加服务器的压力。

你可能感兴趣的:(Python-Django)