cookie和session
Posted q767498226
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cookie和session相关的知识,希望对你有一定的参考价值。
一. cookie
1. cookie的由来
由于HTTP协议是无状态的,所以每次请求的时候都是全新的,但是有些数据是需要保留的(帐号密码),所以出现了cookie.
2. cookie的原理及作用
cookie可以保存在本地(键值对保存),用户每次去请求的时候都带着数据,这样就不需要用户每次都输入数据了.
3. cookie中的方法
response.set_cookie("key","value") 需要在响应对象上设置
response.set_signed_cookie("key","value",s) 加盐版的
request.COOKIES 获取到的是字典形式的对象,可以使用字典的方法操作
request.get_signed_cookie() 获取加盐版的cookie
response.delete_cookie("key") 删除cookie
4. cookie版的登陆
cookie版 def login(request): if request.method == "GET": return render(request, "login.html") else: username = request.POST.get("username") password = request.POST.get("password") ret = models.UserInfo.objects.filter(username=username, password=password) if ret.exists(): cookie_obj = request.COOKIES # print(cookie_obj) # {‘csrftoken‘: ‘YpOTG4x5A4NVRJb45PCmeDpPxVUEKV6wLJgUxBnQBdTnrb0PQp0JlKqWAAPd3Hkx‘} ret = redirect(reverse("home")) # ret.set_cookie("is_login", True, max_age=10) # max_age 是过多久清空这个cookie,默认14天 ret.set_signed_cookie("is_login", True, salt="hhh") # 加盐版 # print(ret) # <HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/home"> return ret else: return render(request, "login.html") def home(request): is_login = request.COOKIES.get("is_login", False) # cookie里面存的是字符串类型的 # is_login = request.get_signed_cookie("is_login", False, salt="hhh") # 过去加盐版的 # print(is_login, type(is_login)) # True <class ‘str‘> 这是登陆时的 # print(is_login, type(is_login)) # True:1h2D76:1avfdKMi4-9eedxyPi4RgcRLCP0 <class ‘str‘> 加盐版的 if not is_login: # 因为登陆成功返回的不是bool而是一个字符串,所以判断没有登陆的状态 return redirect("login") else: return render(request, "home.html")
二. session
1. session的由来
由于cookie最大支持409kb,并且存在客户端的,不安全,所以有了session,它支持更多字节,并且存在服务器.
2. session的原理
用户每次请求的时候都带着一个sessionid,服务器收到后使用sessionid识别拿对应的数据,一个浏览器对应一个sessionid.
3. session中的方法
request.session 获取session对象,跟字典一样
request.session.get("key",None) 获取session中的key
del request.session["key"] 删除session
request.session.delete() 删除当前会话的session
request.session.flush() 删除当前会话数据并删除cookie
request.session.set_expiry(value) value是整数时,就是在多少秒后失效,为0时,关闭浏览器就失效
4. session版的登陆
def login(request): if request.method == "GET": return render(request, "login.html") else: username = request.POST.get("username") password = request.POST.get("password") ret = models.UserInfo.objects.filter(username=username, password=password) if ret.exists(): request.session.setdefault("username", username) # 给session添加键值 request.session["is_login"] = True return redirect(reverse("home")) else: return render(request, "login.html") # 装饰器验证登陆 def session(fn): def inner(request, *args, **kwargs): is_login = request.session.get("is_login", False) if is_login: ret = fn(request) return ret else: return redirect(reverse("login")) return inner
以上是关于cookie和session的主要内容,如果未能解决你的问题,请参考以下文章