在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。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|