Cookie和session

cookie和session的区别:

1.cookie;
cookie是保存在浏览器端的键值对,可以用来做用户认证
2.session;
将用户的会话信息保存在服务端,key值是随机产生的字符串,value值是session的内容
依赖于cookie将每个用户的随机字符串保存到用户浏览器上.

Django中session默认保存在数据库中:django_session表
flask,session默认将加密的数据写在用户的cookie中 

  Cookie的原理

1.客户端向服务端发送请求,第一次的值为空 cookie:{}
2.服务端接受请求后,设置cookie,request.set_cookie(key,value,),随着响应发给浏览器
3.客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器
当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!


如果想看到浏览器的Cookie可以点击浏览器的 锁 或者 感叹号


设置Cookie
# 1.设置cookie
HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
#参数:
    #key:    cookie的名称(*)
    #value:   cookie的值,默认是空字符
    #max_age:cookies的持续有效时间(以秒计),如果设置为 None,cookies 在浏览器关闭的时候就失效了。
    #expires:cookies的过期时间,格式:"Wdy, DD-Mth-YY HH:MM:SS GMT" 如果设置这个参数,它将覆盖max_age。
    #path:    cookie生效的路径前缀,浏览器只会把cookie回传给带有该路径的页面,这样你可以避免将cookie传给
             站点中的其他的应用。/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
    #domain:   cookie生效的站点。你可用这个参数来构造一个跨站cookie。如, domain=".example.com" 所构造的
              cookie对下面这些站点都是可 读的: www.example.com 、 www2.example.com。
              如果该参数设置为None,cookie只能由设置它的站点读取。
    #secure:   如果设置为 True ,浏览器将通过HTTPS来回传cookie。
    #httponly: 仅http传输   不能使用js获取cookie

#同set_cookie,不同点在于设置salt,即加盐,加密存储cookie数据
HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)

获取Cookie

#2 获取cookie
HttpRequest.COOKIES.get(key)

#获取加“盐”的cookie
HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

删除Cookie

# 3删除cookie 
HttpResponse.delete_cookie(key, path='/', domain=None)


Session

Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie本身保存在客户端,可能被拦截或窃取,自身安全性较差;
而Session保存在服务器,有较高的安全性。
所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息
session的特性:
Session是服务器端技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,
由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,
当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

Session配置

首先在settings.py中有如下配置(系统默认),

INSTALLED_APPS = [
    'django.contrib.sessions',
]
MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
]

session操作

def doregister(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    email = request.POST.get('email')
    user = User()
    user.username = username
    user.password = md5(password.encode('utf8')).hexdigest()
    user.email = email
    user.save()
    # 设置session
    request.session['username'] = username
    return render(request,"common/notice.html",context={
        'code':1,
        'msg':'注册成功',
        'url':'three:index',
        'wait':3
    })

获取Session

def index(request):
    # session获取 
    username = request.session.get('username')
    return render(request,'three/index.html',context={'username':username})

删除Session

def logout(request):
    request.session.flush()
    return redirect(reverse("three:index"))

#clear() 清空所有session 但是不会将session表中的数据删除

#flush() 清空所有 并删除表中的数据

#logout() 退出登录 清除所有 并删除表中的数据

#del req.session[‘key’] 删除某一个session的值

Session常用操作

1.设置session: request.session["is_login"]="1"
    2.获取session: request.session.get(""is_login")
    3.只删除session数据  request.session.delete()
    4.删除session数据和cookie request.session.flush()
    5.设置会话Session和Cookie的超时时间
        request.session.set_expiry(value) 
        * 如果value是个整数,session会在些秒数后失效。 cookie值消失
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。
   6.在setting中添加
      SESSION_SAVE_EVERY_REQUEST =True  每次请求都保存Session设置后,如果存在数据库中,需要迁移数据库
 
 
原文地址:https://www.cnblogs.com/love2000/p/11797505.html