cookie
1、在网站中,http请求是无状态的。也就是说即使第一次和服务器连接并且登录成功后,第二次请求服务器的时候服务器仍然不能知道当前是哪个用户的请求。cookie的出现就是为了解决这个问题
2、第一次登录后服务器返回一些数据(cookie:将用户信息作为内容写入到cookie中,如用户名)给浏览器,然后浏览器保存到本地,当该用户第二次请求服务器响应的时候,就会自动的把上次请求存储的cookie数据携带给服务器,服务器通过浏览器携带的数据就能判断是哪个用户请求数据了
⑴第一次访问页面时,服务器将Cookie信息放在响应头中发送给客户端。此后浏览器再次访问时网站时就将Cookie信息放在请求头中发送给服务器
⑵感觉是:访问网站首页时服务器返回Cookie信息(用户已登录),在访问这个网站其他网页时就只需要接收Cookie就能根据Cookie确定当前是哪个用户了
3、cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4kb,很多浏览器都限制一个站点最多保存20个cookie,因此使用cookie只能存储一些小量的数据
注:
1、cookie是由服务器生成,存储在浏览器端的一小段文本信息
2、cookie的特点:
⑴以键值对方式进行存储
⑵通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给该网站的服务器
⑶cookie是基于域名安全的
⑷cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期
Cookie的不可跨域名性
1、很多网站都会使用Cookie。例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢
2、答案是否定的。Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie
3、Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie
4、需要注意的是,虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,二者同样不能互相操作彼此的Cookie
Django中操作Cookie
1、前面在学习Django中的HttpResponse对象时,介绍过HttpResponse对象下面有set_cookie()方法和delete_cookie()方法,这两个方法就是用来设置和删除Cookie信息的
2、即:在HttpResponse对象中设置Cookie信息,在HttpRequest对象中获取cookie信息
设置cookie
1、设置cookie:即将设置的Cookie值发送给浏览器。因此我们需要通过HttpResponse对象来设置。设置cookie可以通过"HttpResponse对象.set_cookie()"来设置
2、set_cookie()方法如下:
⑴Cookie的目的是让服务器知道当前用户是谁
⑵所以值里面一般都是用户信息相关的数据,键名任意
set_cookie(self, key, value='', max_age=None, expires=None, path='/',
domain=None, secure=False, httponly=False, samesite=None)
3、set_cookie()方法的相关参数如下:
⑴key:cookie的键名,必填参数
⑵value:cookie的值,必填参数
⑶cookie是以键值对方式进行存储
| 参数名 | 描述 |
| key | 这个cookie的key |
| value | 这个cookie的value |
| max_age | 最长生命周期,单位是秒 |
| expires | 过期时间,跟max_age类似,只不过这个参数需要传递一个具体的日期,如datetime或者是符合日期格式的字符串。注意,如果同时设置了expires和max_age,那么将会使用expires的值作为过期日期 |
| path | 对域名下哪个路径有效。默认是对域名下的所有路径都有效 |
| domain | 针对哪个域名有效。默认是针对主域名下都有效,如果只要针对某个子域名才有效,可以设置这个属性 |
| secure | 是否是安全的,如果设置为True,那么只能在https协议下才可用 |
| httponly | 默认是False。如果为True,那么在客户端不能通过JavaScript进行操作 |
例1:
⑴编辑视图

⑵访问

注:
1、上面这个例子中:使用render()函数来实例化了一个HttpResponse对象(response变量),并同时给这个HttpResponse对象添加了一些响应头信息并成功返回给了浏览器
2、同时想说明下render()函数:
⑴前面章节中我们都是在视图函数最后return时使用render()方法来实例化了一个HttpResponse对象,然后再将这个HttpResponse对象传递给前端
⑵这里只是说先实例化了一个HttpResponse对象,并且继续使用HttpResponse对象的属性或方法来给这个将要返回的HttpResponse对象增加响应头信息。等全部处理完成后再返回这个HttpResponse对象
⑶这样就同时实现了:返回模板、设置响应头的功能。当然还可以传入上下文content参数
3、render()函数语法:render(request, template_name, context=None, content_type=None, status=None, using=None)
⑴render()方法可以用于创建一个HttpResponse对象,同时也能设置HttpResponse对象对象的属性和方法(content、status_code、content-type等)。还能传入模板(template_name参数)、上下文并返回给前端
⑵需要注意的是:render()方法,第一个参数必须是request
例1_1:
⑴编辑视图

⑵访问

注:这个例子中返回了一个Json格式的响应(JsonResponse对象),同样也可以使用set_cookie()方法来设置cookie等响应头信息
参数详解
max_age
1、作用:用于设置Cookie信息的最长生命周期,单位是秒(表示多少秒后Cookie信息过期)
⑴即在cookie信息有效期内,浏览器都会使用这个cookie,如果过期了就会重新获取cookie信息
2、cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期
例2:
⑴编辑视图

⑵访问

注:
1、可以看到,如果设置了Cookie信息的最大保存时长,那么在浏览器的Cookie信息中也会显示对应的设置
2、在例1中,我们没有设置最大保存时长,浏览器的Cookie信息中就没有显示对应的设置。表示默认关闭浏览器之后cookie就会过期
expires
1、作用:也是用于设置Cookie信息的过期时间,跟max_age类似,只不过这个参数需要传递一个具体的日期,如一个datetime对象或者是符合日期格式的字符串
⑴表示:到什么时间Cookie信息过期
2、注意,如果同时设置了expires和max_age,那么将会使用expires的值作为过期日期
例3:
⑴编辑视图

⑵访问

例3_1:

path
1、作用:用于设置Cookie信息对域名下哪个路径有效。默认是对域名下的所有路径都有效
2、域名相当于服务器的IP地址:域名经DNS解析后就是IP地址
⑴如果不设置path参数的话,只要是同一个IP地址下的所有URL路径都是共用Cookie信息的
⑵如果设置了path参数的话,那么Cookie信息就只能用于以设置的URL路径开头的URL
例4:不设置path参数
⑴编辑视图:Polls

⑵编辑视图:Login

⑶设置URL路径

⑷访问:Pool,设置cookie信息

⑸访问:Login,获取cookie信息

例4_1:设置path参数
⑴编辑视图

⑵访问:Pool,设置cookie信息

⑶访问:Login,获取cookie信息

例4_2:同一个应用程序下
⑴编辑视图

⑵访问

注:
如果设置了path参数,那么只有以path开头的URL才能使用对应的cookie信息
⑴如:path = "/zh/"
⑵只有以/zh/开头的URL才能使用该cookie信息。如'/zh/index/'
⑶不是以/zh/开头的URL不能使用该cookie信息。如'/login/index/'
domain
1、作用:针对哪个域名有效。默认是针对主域名下都有效,如果只要针对某个子域名才有效,可以设置这个属性
2、这个参数目前用不到,就先不介绍了
secure
1、作用:是否是安全的,如果设置为True,那么只能在https协议下才可用
2、这个参数目前用不到,就先不介绍了
httponly
1、作用:默认是False。如果为True,那么在客户端不能通过JavaScript进行操作
2、这个参数目前用不到,就先不介绍了
删除cookie
1、删除cookie信息的话,就是使用delete_cookie()方法来删除一个cookie信息
⑴实际上删除cookie就是将指定的cookie的值设置为空的字符串,然后将他的过期时间设置为0,也就是浏览器关闭后就过期
⑵delete_cookie()方法也是HttpResponse对象下的方法,所以需要先实例化一个HttpResponse对象
2、参数为:待删除cookie信息的键名
3、在【退出登录】操作时,如果代码使用的是delete_cookie()的话,那么实际上还是会处于登录状态。因为delete_cookie()表示浏览器关闭后就过期。所以如果想【退出登录】后就无登录信息的话,可以,随便设置一个Cookie信息,然后使它的到期时间为负数:response.set_cookie("userID",None,max_age=-1)
例5:
⑴编辑视图

⑵访问

获取cookie
1、获取浏览器发送过来的cookie信息,可以通过request.COOKIES来获取,这个对象是一个字典类型(可以使用字典方法来获取)
例6:
⑴编辑视图

⑵访问

本文详细介绍了Cookie的作用、特点和不可跨域名性,并探讨了在Django中如何设置、删除和获取Cookie,包括set_cookie()和delete_cookie()方法的使用,以及max_age、expires等参数的解释。

1万+

被折叠的 条评论
为什么被折叠?



