cookie和session
cookie
cookie的使用方法
设置cookie
from django.shortcuts import render,HttpResponse
def set_cookie(request):
在HTTPResponse部分设置COOKIE值
cookie_reponse = HttpResponse(‘这是一个关于cookie的测试’)
cookie_reponse.set_cookie(‘test’,’hello cookie’)
return cookie_reponse
获取cookie
def get_cookie(request):
获取cookie值,从request属性中的COOKIE属性中
cookie_data = request.COOKIES.get(‘test’)
return HttpResponse(‘Cookie值为:%s’ % cookie_data)
删除cookie
- def delete_cookie(request):
response = HttpResponseRedirect(‘/check_cookie/‘)response.delete_cookie('test') return response
- def delete_cookie(request):
怎么防止修改cookie
使用set_signed_cookie这个函数进行防止用户在客户端进行修改(并不是直接给cookie加密)
代码:
def check_salt_cookie(request):
try:salt_cookie = request.get_signed_cookie(key='salt_cookie',salt='nice') except KeyError: #获取不到该key值的Cookie response = HttpResponse('正在设置一个salt Cookie值') response.set_signed_cookie(key='salt_cookie',salt='nice',value='salt_cookie') return response
else: #获取到了对应key值,展示到新的HttpResonse中
return HttpResponse(‘获取到的salt Cookie值:%s’ % salt_cookie)注意:
- 因为第一次访问时没有添加cookie值所以就会有keyerror的错误
- 当有了这个错误你就设置cookie就可以了
- 当你刷新页面的时候已经有了cookie值所以直接获取加盐的cookie
session
session的使用方法
使用流程
- 客户端访问服务端,服务端为每一个客户端返回一个唯一的 sessionid ,比如 xxx 。
- 客户端需要保持某些状态,比如维持登陆。那么服务端会构造一个 {sessionid: xxx } 类似这样的字典数据加到 Cookie 中发送给用户。注意此时,只是一个随机字符串,返回给客户端的内容并不会像之前一样包含实际数据。
- 服务端在后台把返回给客户端的 xxx 字符串作为 key 值,对应需要保存的服务端数据为一个新的字典,存储在
服务器上,例如: {xxx : {id:1}} - 注意:
- 默认存储在数据库的 Session 数据,是通过 base64 编码的,我们可以通过 Python 的
base64 模块下的 b64decode() 解码得到原始数据
- 默认存储在数据库的 Session 数据,是通过 base64 编码的,我们可以通过 Python 的
获取需要的session
- session_data = request.session.get(Key)
- session_data = request.session[Key]
- 注意:
- 在 Session 中获取对应值, get 方法获取时,如不存在该 Key 值,不会引发异常,返回 None
而第二种直接通过字典获取,如 Key 值不存在,引发 KeyErro
- 在 Session 中获取对应值, get 方法获取时,如不存在该 Key 值,不会引发异常,返回 None
删除session
- del request.seesion[Key]
- 删除对应session, Key 值不存在时,引发 KeyError
- request.session.clear()
- 清空 Session 中的所有数据。这里客户端还会保留 sessionid
只不过在服务端 sessionid 对应的数据没有了。
- 清空 Session 中的所有数据。这里客户端还会保留 sessionid
- request.session.flush()
- 直接删除当前客户端的的Seesion数据。这里不光服务端sessionid对应的数据没有了,客户端的
sessionid也会被删除
- 直接删除当前客户端的的Seesion数据。这里不光服务端sessionid对应的数据没有了,客户端的
- 代码:
- def delete_session(request):
if request.session.get(‘test_id’):del request.session['test_id'] return HttpResponse('Session被删了') else: return HttpResponse('目前没有任何需要删除的session') - 注意:
- 这里使用 del request.session[Key] 的方式来进行 Session 的删除
- 如果存在对应 test_id 的 Session 值则删除,反之返回一个字符串
- 总结:
- 使用的是 del 的针对性删除方式,这样不会将整个客户端的 session 删除掉
- 使用 request.session.clear() ,只是清空了服务端 Session 中的数据,但是客户端的 Cookie 中还会保存sessionid ,只不过这个值对应的字符串所对应的用户数据是一个空
- 使用 request.session.flush() ,那么客户端 Cookie 中保存的 sessionid 首先会被删除,其次通过
sessionid 值保存的用户数据也会被全部删除。
- def delete_session(request):
- del request.seesion[Key]
如何设置有效期设置cookie
- 设置Session的有效时间
- value :有效时间
- 为整数时:将在value为秒单位之后过期
- 为0时:将在用户关闭浏览器之后过期。
- 为None时:使用全局过期的设置,默认为两个星期,14天。
- 为datetime时:在这个指定时间后过期。
- 返回距离过期还剩下的秒数
- 代码:
- request.session.get_expiry_age()
- 代码:
- 清除过期的 Session 会话
- 代码:
- request.session.clear_expired()
- 代码:
- 代码展示:
- from django.shortcuts import render,HttpResponse
import datetime
def set_session(request):if request.session.get('test_id'): session_data = request.session.get('test_id')# 用户拿到的的session随机字符串 session_key = request.session.session_key # 获取客户端浏览器中的SessionID值 session_expire = request.session.get_expiry_age() now = datetime.datetime.now() expire_time = now + datetime.timedelta(seconds=session_expire) response = '<div>SessionID : %s</div>' % session_key + \ '<div>Session : %s</div>' % session_data + \ '<div>ExpireTime : %s</div>' % expire_time return HttpResponse(response) else: request.session['test_id'] = 'TEST' request.session.set_expiry(None) return HttpResponse('已设置好Session') - 注意:
- 用户在第一次访问时,会走 else 分支
- 因为此时还没有任何服务端的 Session 及客户端的 Cookie 值设定
- 所以我们通过 request.session[Key] 的方式来设置一个 Session 值,值为 TEST
- 当用户第二次访问时将展示出所设置好的Session值及在客户端浏览器中存储的sessionid
- from django.shortcuts import render,HttpResponse
- 设置Session的有效时间
Author: kangyuetao
Link: https://kangyuetao.github.io/34881/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.
