当我们通过浏览器来访问网站的时候,由于HTTP本身是无状态的,所以当我们结束访问后第二次再来访问的时候,服务器本身是不认识我们(它不知道我们之前来过,也就不会保存我们之前的信息),比如当我们第一次登入的网站后第二次再来的时候我们还是需要重新登入,这样网站不能保存我们的密码,是不是很麻烦,那如何解决这个问题呢?那cookie和session就是为了解决这个问题而产生的。
cookie:(1)我们第一次访问服务器的时候是 request直接请求过去,然后服务器会返回response和一个设置好的cookie值给浏览器,这个cookie直接保存在浏览器本地可以设置过期时间,当我们第二次访问这个网站的时候我们发送的服务器的不在是单纯的request而是加上了一个cookie值(这个值是唯一的,服务器通过这个值来判断这个访问者是谁,有哪些记录等),服务器根据这些值再发给浏览器信息。(图左)
(2)cookie是保存在本地的一种存储机制,大小不超过4Kb
session:(1)我们第一次访问服务器的时候,服务器在产生一个session的文件保存在服务器数据库中,这session文件中保存的就是这个客户的一些信息包括一个session_id,用户名,过期时间等等,并且是以加密的形式保存;然后服务器响应给浏览器的时候会把这个session_id发送给浏览器,当用户下次访问服务器的时候会把session_id一起发送给服务器,服务器通过session_id去数据库中查找该用户的信息,解析这些信息后,返回给浏览器特定的页面。
(2)session本身是一种思路,解决方案,不同的语言,框架设置session的方式不同;它是一种保存在服务器数据库中的一种存储方式;它是加密的。
Django中cookie的设置:
设置cookie:
response.set_cookie("key","value",max_age = 180,path="/cms/")
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
进行操作。
获取cookie:
通过request.COOKIES
来获得。这个对象是一个字典类型
删除cookie:
通过delete_cookie("username")来删除cookie,实际上是把cookie的值设置为空额字符串,然后把过期时间设置为0;关闭浏览器自然就删除了
cookie代码实例
from django.http import HttpResponse from datetime import datetime from django.utils.timezone import make_aware def index(request): #设置cookie response = HttpResponse("ok") expires = datetime(year=2019,month=12,day=20,hour=0,minute=0,second=0) expires = make_aware(expires) response.set_cookie("username","abc",max_age=190,expires = expires,path="/cms/") return response def delete_cookie(request): #删除cookie response = HttpResponse("delete") response.delete_cookie("username") return response def cookie_list(request): #获取cookie cookies = request.COOKIES username = cookies.get("username") return HttpResponse(username)
django中session的设置:
session
常用的方法如下:
-
get
:用来从session
中获取指定值。 -
pop
:从session
中删除一个值。 -
keys
:从session
中获取所有的键。 -
items
:从session
中获取所有的值。 -
clear
:清除当前这个用户的session
数据。 从浏览器中删除,不会删除数据库的中 -
flush
:删除session
并且删除在浏览器中存储的session_id
,一般在注销的时候用得比较多。 直接删除数据库中的 -
set_expiry(value)
:设置过期时间。- value可以是整形代表秒数,多少秒后过期
- 可以是0,关闭浏览器就过期
- 可以是None,会使用全局的
session
配置。在settings.py
中可以设置SESSION_COOKIE_AGE
来配置全局的过期时间。默认是1209600
秒,也就是2周的时间
-
clear_expired
:清除过期的session
。Django
并不会清除过期的session
,需要定期手动的清理,或者是在终端,使用命令行python manage.py clearsessions
来清除过期的session
。
from datetime import timedelta def session_list(request): # request.session["username"] = "username" #添加session # username = request.session.get('username') #获取session # print(username)
request.session.clear() #删除session_id 不会删除数据库中的数据
request.session.flush() #暴力删除数据库中的数据一起删除
request.session.clear_expired() #清除过期的session expiry = timedelta(days=2) request.session.set_expiry(None) return HttpResponse("ok")