Django笔记:Cookie和Session
在Django中,cookie和session都是使用键值对的形式来进行存储和操作的,可以使用response_obj.set_cookie()
、response_obj.delete_cookie()
和request.COOKIES
等方式来设置、删除和获取cookie信息,使用request.session
中的方法来操作session数据。
一、cookie操作
cookie是以键值对的形式保存在响应对象中并返回给客户端的,所以操作cookie需要在HttpResponseBase
对象或其子类对象中操作并返回给客户端。
设置cookie
使用HttpResponseBase
对象或其子类对象的set_cookie
方法进行设置,该方法的常用参数如下:
-
key
:键值对的key
。 -
value
:键值对的value
。 -
max_age
:有效期(秒),默认是浏览器会话结束时到期(即关闭整个浏览器时到期)。 -
expires
:设置具体的过期日期,可以是一个datetime
对象或者符合日期时间格式的字符串。如果同时设置了max_age
和expires
,那么将会采用expires
。 -
path
:设置cookie的有效url路径,默认为域名下的根路径,即根路径下所有的路径都是有效的。 -
domain
:设置cookie的有效域名,默认为主域名下都有效,如果只是想针对某个子域名设置cookie,则可以设置此参数。 -
secure
:默认False
,如果设置为True
,则表示只能在https
协议下才有效。 -
httponly
:默认False
,如果设置为True
,则表示客户端不能通过JavaScript操作cookie。
# 视图函数返回一个带有cookie信息的响应对象
def index(request):
response = HttpResponse("cookie page!")
response.set_cookie("username", "zhangsan", max_age=180)
return response
获取cookie
直接通过request.COOKIES
获取即可,这是一个字典对象,通过操作字典的方式进行操作即可。
删除cookie
直接使用HttpResponseBase
对象或其子类对象的delete_cookie(key)
方法删除对应key
的信息即可。
二、session操作
Django中默认是把session数据保存在数据库中(使用migrate
命令时会自动生成一个django_session
表,这个表就是专门用来存储session数据的),客户端请求时,会将该session的sessionid
加入cookie中返回给客户端,同样的,如果需要session中的数据,就会根据cookie中sessionid
去数据库中获取对应的session数据。
session常用操作
直接使用request.session
即可进行session操作,可以像操作字典一样去操作request.session
。注意,在request.session
上操作之后不需要再到响应对象上进行操作了,包括cookie的操作也是不需要我们去进行了,Django会自动将该session的sessionid
添加到cookie中并返回给客户端的。request.session
中常用的方法:
-
get
:获取session中指定的值。 -
pop
:删除session中指定的值。 -
keys
:获取session中的所有key。 -
items
:获取session中所有的键值对。 -
clear
:清除当前用户的所有session数据。这个方法不会立即删除数据库中的数据,客户端也会保留对应的sessionid
,只不过无法获取到对应的session数据而已。 -
flush
:删除session,并且删除在客户端保存的sessionid
。这个方法会同时删除数据库和客户端中对应session数据,所以这个方法通常在注销等功能上用的较多。 -
set_expiry(value)
:设置过期时间。如果value
是0,则表示浏览器关闭时session过期;如果value
是正整数,则表示多少秒后过期;如果是None
,则表示使用全局配置的session过期时间,即settings.py
中的SESSION_COOKIE_AGE
配置项,默认为2周的时间。 -
clear_expired
:清除数据库中过期的session数据。因为Django不会自动清理过期的session数据,所以需要我们手动的清除这些数据,除了使用这个方法外,还可以在终端使用命令python manage.py clearsessions
来清除过期的session数据。
# 在视图函数中获取session信息
def session_test_view(request):
# request.session["username"] = "zhangsan"
username = request.session.get("username")
print(username)
return HttpResponse("session page!")
session的存储方案
Django中默认是把session数据存储在数据库中的,但是Django也提供了其他的session存储方案,在settings.py
中配置SESSION_ENGINE
为以下对应项即可:
-
django.contrib.sessions.backends.db
:默认存储方案,使用数据库进行存储。 -
django.contrib.sessions.backends.file
:使用文件来存储。 -
django.contrib.sessions.backends.cache
:使用缓存来存储。想要使用这个方案,需要在settings.py
中配置CACHES
,并且使用Memcached
缓存系统,不能使用纯粹的内存来存储。 -
django.contrib.sessions.backends.cached_db
:会将数据同时存储到缓存和数据库中,获取数据时会优先到缓存中获取数据,如果缓存发生意外,数据也不会丢失,还可以从数据库中找回来。 -
django.contrib.sessions.backends.signed_cookies
:将session信息加密后存储到浏览器的cookie中。使用这个方案,需要注意下:建议配置SESSION_COOKIE_HTTPONLY=True
,那么浏览器就不能通过JavaScript来操作session数据了;还需要设置SECRET_KEY
,并防止其泄露;当然,cookie中总的数据大小不能超过4KB。