django操作cookie, session
http协议四大特性
1.基于TCP/IP作用于应用层的协议
2. 基于请求响应
3. 无状态 【每次访问对服务器来说都是一个全新的请求】
4. 无链接
如何可以把用户的状态保存下来,不需要总是要登入?
cookie: 保存在客户端浏览器上的键值对, cookie中明文特性不安全,进化一下
session: 保存在服务端上的键值对.【下次访问时,就不需要再登入,带着特有的键值对就可以了】
服务端产生随机的串儿返回给客户端,服务端找一个地方将串儿与对应的信息存起来{‘随机字符’:‘可以是敏感信息,也可以是其它随机值’}
返回给客户端的串是要存放在浏览器上的,而cookie就是存放键值对的地方,当然也可以将session存放在别的地方
django: return HttpRresponse() ==> obj = HttpRresponse()
return render() ==> obj = render()
return redirect() ==> obj = redirect()
这三个都是HttpRresponse对象
设置cookie:
obj.set_cookie( ) 给浏览器设置cookie
获取cookie
request.COOKIE.get('name')
request. COOKIE['name']
登入装饰器
from functools import wraps def login_auth(func): @wraps(func) def inner(request, *args, **kwargs): old_path = request.get_full_path() # print('这是request.path():', request.path) if request.COOKIES.get('name'): return func(request, *args, **kwargs) else: return redirect('/login/?next=%s' % old_path) return inner 设置:
def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'jason' and password == '123': old_path = request.GET.get('next') if old_path: obj = redirect(old_path) else: obj = redirect('/do/') obj.set_cookie("name", "jason", expires=3) return obj
参数:
- key, 键
- value='', 值
- max_age=None, 超时时间
- expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
- path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
- domain=None, Cookie生效的域名
- secure=False, https传输
- httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
django
设置session:
request.session['name'] = 'jason'
干了三件事:1.先成成一个随机的字符串,【一个浏览器APP一行串】
2.在django session表中存储该随机字符串与数据的记录【在中间件时写入】
3.将随机的字符串发送给客户端浏览器
获取session:
request.session.get('name')【浏览器将session串交给django,django会自动比对一下,将结果放入request.session中】
1.django自动获取浏览随机字符串去django session 表里面比对
2. 如果比对成功,会将当前随机字符串对应的数据赋值给request.session
3. 通过request.session 操作该数据(数据不存在也不会影响我们的业务逻辑)
django默认的session存活时间是两周(14天)
浏览器会设置一个键sessionid来存放session值
工作原理:
django会按自己的方式生成一个字符串,字符串后面对应的是一个大字典,asdfsdf4656: {'name': 'jason', 'password': "123', 'code': ‘sfdf’ ....}
设置完成后,将生成的的session串给客户浏览器一份,浏览器来访问我的服务端会携带这个串并自动交给django, django会自动处理,
django判断我的数据库中是否有一个相同的串,有就将session串对应的大字典对象放入request.session中。
删除session:
1. request.session.deletet() # 删除数据库中的session
2. request.session.flush() # 删除数据和会话的Coikie 用于确保前面的会话数据不可以再次被用户的浏览器访问
设置会话Session和Cookie的超时时间request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。