阅读 155

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 保护


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐