Django笔记:Cookie和Session

Django笔记:Cookie和Session[Python常见问题]

在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_ageexpires,那么将会采用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。
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Django笔记:Cookie和Session