Django:Cookie与Session
1、cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。
cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。
2、cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。
问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。
我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。
3、总结而言:cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。
4、另外,上述所说的cookie和session其实是共通性的东西,不限于语言和框架
具体实例:
一、仅使用cookie
name:名称不能唯一确定一个Cookie。路径可能不同。
value:不能存中文和空格。
path:默认值是写Cookie的那个程序的访问路径
maxAge:cookie的缓存时间。默认是负数(默认存在浏览器的内存中),即浏览器关闭则销毁cookie,单位是秒;设置为0表示删除该cookie ;正数表示缓存(持久化到磁盘上)的时间。
1.创建一个django项目
2.setting中的中间键关闭csrf
3.url进行路由分发:
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('login/', views.login),#登录界面的url path('index/', views.index),#登录成功后的主页url ]
4.编写对应的视图函数
#登录页面
def login(req): #1.第一次访问login的url,get请求,此时生成一个COOKIES print("COOKIES:", req.COOKIES) if req.method=="POST":#3.login.html中的表单以POST方式提交后,进入此逻辑判断语句 user=req.POST.get("user")#获取表单传递过来的用户名 pwd=req.POST.get("pwd") #获取表单传递过来的密码 if user=="yuan" and pwd=="123":#4.进行用户名与密码验证 ret=redirect("/index/")#5.验证成功,获取一个跳转页面(未返回给客户端(浏览器)) ret.set_cookie("bilibili","cheers")#6.给页面跳转添加一个cookie,用于下次访问时免登录 return ret #7.返回一个跳转的页面(返回给客户端(浏览器)) return render(req,"login.html")#2.返回一个用于登录的login.html(一个form表单)
#登录成功后的主页
def index(req): if req.COOKIES.get("bilibili",None)=="cheers":#1.判断是否已登录 name="yuan" return render(req,"index.html",locals())#2-2,非初次访问,已登录,仅需index页面访问主页信息 return redirect("/login/")#2-1.初次访问,未登录,跳转到login页面进行登录操作
5.编写对应的模版html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> <p>用户名:<input type="text" name="user"></p> <p>密码:<input type="password" name="pwd"></p> <p><input type="submit" value="提交"></p> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Hello {{ name }}</h1> </body> </html>
二、cookie+session
仅views.py文件不同
from django.shortcuts import render,redirect # Create your views here. import datetime def login(request): # 1.第一次访问login的url,get请求,此时生成一个COOKIES print(request.COOKIES) print(request.session) if request.method == "POST":#3.login.html中的表单以POST方式提交后,进入此逻辑判断语句 user = request.POST.get("user")#获取表单传递过来的用户名 pwd = request.POST.get("pwd")#获取表单传递过来的密码 if user == 'yuan' and pwd == '123':#4.进行用户名与密码验证 # #COOKIE # ret = redirect('/index/') # #COOKIE中设置有效时间 # #max_age与expires是设置有效时间,不同浏览器可能找不到max_age或者expires,所以一般设置两个相同的有效时间 # ret.set_cookie('bilibili',"cheer",max_age=10,expires=datetime.datetime.utcnow()+datetime.timedelta(days=3)) # return ret #COOKIE+SESSION request.session['is_login']= True #5.验证成功,登录状态设为True request.session['user'] = user #6.以字典的形式设置session键值对,{"用户名":"用户的个人信息"},将用户的个人信息存储在服务器上,"用户名"相当于一把访问服务器的钥匙 # #SESSION中设置有效时间 # request.session.set_expiry(value=10) #10秒后失效 return redirect('/index/') #7.返回一个跳转的页面(返回给客户端(浏览器)) return render(request,"login.html") #2.返回一个用于登录的login.html(一个form表单) def index(request): # #COOKIE # if request.COOKIES.get('bilibili',None) == 'cheer': # name='yuan' # return render(request,'index.html',locals()) #COOKIE+SESSION if request.session.get('is_login',None): #1.判断是否已登录 name=request.session.get('user') #获取session的键"user"(钥匙) return render(request,'index.html',locals()) #2-2,非初次访问,已登录, else: return redirect('/login') #2-1.初次访问,未登录,跳转到login页面进行登录操作
下面我们再来最后的总结一下cookie和session的知识点
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式
一、操作Cookie
获取cookie:request.COOKIES[key]
设置cookie:response.set_cookie(key,value)
由于cookie保存在客户端的电脑上,所以,jquery也可以操作cookie。
<script src='http://830909.blog.51cto.com/static/js/jquery.cookie.js'></script> $.cookie("list_pager_num", 30,{ path: '/' });
二、操作Session(session默认在服务器端保存15天)
获取session:request.session[key]
设置session:reqeust.session[key] = value
删除session:del request.session[key]
(这个删除其实就是把数据库的session_data更新为一个其他的值了,并没有立即删除)
request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
典型区别
1、cookie采用的是在客户端保持状态的方案,因此数据存放在客户的浏览器上,而session采用的是服务端保持状态的方案,因此数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗。 考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE。
参考:https://blog.csdn.net/qq_28296925/article/details/80921585?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

浙公网安备 33010602011771号