cookie和session
cookie和session
cookies和sessions
http协议
无连接
http 应用层协议 基于TCP connection: keep-alive 保持一段时间
建立连接之后,可以一直使用,减轻服务端压力
无状态: 不保存任何记录,对服务器来说,每次的请求都是全新的
cookie
1.cookie 是浏览器技术 ,是服务端发送出来存储在浏览器上的一组键值对,下次访问服务器时会携带键值对
2.cookie 大小上限4kb
3.一个服务器最多在浏览器上保存20个cookie
3.一个浏览器最多保存300个cookie
浏览器访问服务器,带这个空cookie,然后由服务器产生内容,浏览器收到相应后保存在本地
,当浏览器再次访问时,浏览器会带上cookie,服务器可以通过cookie来判断是谁了
重点
一个用户 --> 一个浏览器 --> 对应一个网站
一个浏览器访问一个网站时 不能同时存在两个用户,第二个用户的cookie会覆盖第一个用户的
保证安全
操作
ctrl + shift +del 清除浏览器cookie
cookies 是通过响应对象来设置的的,cookie取出来的是字典
session 是通过request来设置的,session 取出来的是session object 对象
django 操作 cookie
设置cookie 响应对象调用
ret = HttpResponse('ok')
ret.set_cookie('is_login',True)
获取cookie
if request.COOKIES.get('is_login') == 'True':
return redirect('app01:show')
通过装饰器玩cookie
def loginauth(f):
def inner(request,*args,**kwargs):
if request.COOKIES.get('is_login') == 'True':
ret = f(request,*args,**kwargs)
return ret
else:
return redirect('login')
return inner
def show(request):
return render(request,'show.html')
参数:
max_age =秒 超时时间 单位是秒 浏览器会清除cookie
expires =datetime 类型数据 超时时间
path ='/' 生效路径,/表示根目录,表示根目录下的cookie可以被任何url页面访问
domain =None cookie生效的域名
secure =false,http传输
删除cookie
ret.delete_cookie('is_login')
django 玩session
设置session
request.session['is_login'] = True
1.生成了session_id:随机字符串
2.在cookie里面加上了一个键值对 session_id:zssz
3.将用户的数据进行了加密,并保存到了django_session表里面,形式就是一条记录
session_key session_data
asfjakskd 用户数据加密后的字符串
一个用户 一个浏览器 只保存一条记录(不清除cookie的时候)
清除cookie后浏览器的session_id没了
取session
is_login = request.session['is_login']
is_login = request.session.get('is_login')
1.从cookie里面拿出了session_id:xxx这个随机字符串
2.去django_session表中查询对应的数据
3.反解加密的用户数据,并获取用户需要的数据
session 方法
设置值:
request.session['k1'] ='v1'
request.session.setdefault('k1','v1')
取值:
request.session.get('k1')
request.session['k1']
删除:
del request.session['k1']
所有 键,值,键值对
request.session.keys()
request.session.values()
request.session.items()
会话session的key
session_key = request.session.session_key
django 自动加的session过期记录 两周
将所有session失效的日期小于当前日期的数据删除
request.session.clear_expired()
检查会话的session的key在数据库中是否存在
request.session.exists('session_key')
删除当前会话的session数据,删除数据库中的记录
request.session.delete()
点击退出 后删除所有记录
删除当前会话数据并删除会话的cookie
request.session.flush()
修改session 的名字
from django.conf import global settings
找到 session_cookie_name 修改
浏览器 cookie名字被修改
一般引入配置 from django.conf import setting
django 默认支持session,其内部提供了5中类型的session搞那个开发着使用
1.数据库 2.缓存 3.文件 4.缓存+数据库 5.cookie,session
覆盖全局 的 session/cookie 设置
cookie 设置中文的 两种方式
def cookie_hans(request):
ret = HttpResponse('ok')
ret.set_cookie('k1','喜欢你')
return ret
报错: UnicodeEncodeError: 'latin-1' codec can't encode characters in position 105-107: ordinal not in range(256)
设置 cookie时 字符串可以是unicode字符串, 就是不能出现中文,禁止中文
json.dumps('你好') ---> unicode json.dumps 中文 默认是unicode
解决方式一:
设置cookie
ret.set_cookie('k1','喜欢你'.encode('utf-8').decode('iso-8859-1'))
取cookie
request.COOKIES['k1'].encode('iso-8859-1').decode('utf-8')
cookie 常用参数及总结
max_age = 秒数
expired = 日期
删除cookie ret.delete_cookie('user')
cookie 的缺点: 有上限 ,浏览器明文显示(不安全), 存在本地
session 总结
解决了cookie不安全的问题,没有上限,数据可以存在数据库,文件等多种组合方式中
设置 装饰器函数 强制过csrf_token验证
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt 豁免 post请求 也不用写csrf_token
@csrf_protect 保护