kangyuetao
for me

cookie和session

2018-04-01 技术点
Word count: 1.2k | Reading time: 5min

cookie和session

  1. cookie

    1. cookie的使用方法

      1. 设置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

      2. 获取cookie

        • def get_cookie(request):

          获取cookie值,从request属性中的COOKIE属性中

          ​ cookie_data = request.COOKIES.get(‘test’)
          ​ return HttpResponse(‘Cookie值为:%s’ % cookie_data)

      3. 删除cookie

        • def delete_cookie(request):
          response = HttpResponseRedirect(‘/check_cookie/‘)
          response.delete_cookie('test')
          return response
      4. 怎么防止修改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
  2. session

    1. session的使用方法

      1. 使用流程

        • 客户端访问服务端,服务端为每一个客户端返回一个唯一的 sessionid ,比如 xxx 。
        • 客户端需要保持某些状态,比如维持登陆。那么服务端会构造一个 {sessionid: xxx } 类似这样的字典数据加到 Cookie 中发送给用户。注意此时,只是一个随机字符串,返回给客户端的内容并不会像之前一样包含实际数据。
        • 服务端在后台把返回给客户端的 xxx 字符串作为 key 值,对应需要保存的服务端数据为一个新的字典,存储在
          服务器上,例如: {xxx : {id:1}}
        • 注意:
          1. 默认存储在数据库的 Session 数据,是通过 base64 编码的,我们可以通过 Python 的
            base64 模块下的 b64decode() 解码得到原始数据
      2. 获取需要的session

        • session_data = request.session.get(Key)
        • session_data = request.session[Key]
        • 注意:
          1. 在 Session 中获取对应值, get 方法获取时,如不存在该 Key 值,不会引发异常,返回 None
            而第二种直接通过字典获取,如 Key 值不存在,引发 KeyErro
      3. 删除session

        • del request.seesion[Key]
          1. 删除对应session, Key 值不存在时,引发 KeyError
        • request.session.clear()
          1. 清空 Session 中的所有数据。这里客户端还会保留 sessionid
            只不过在服务端 sessionid 对应的数据没有了。
        • request.session.flush()
          1. 直接删除当前客户端的的Seesion数据。这里不光服务端sessionid对应的数据没有了,客户端的
            sessionid也会被删除
        1. 代码:
          • 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 值则删除,反之返回一个字符串
          • 总结:
            1. 使用的是 del 的针对性删除方式,这样不会将整个客户端的 session 删除掉
            2. 使用 request.session.clear() ,只是清空了服务端 Session 中的数据,但是客户端的 Cookie 中还会保存sessionid ,只不过这个值对应的字符串所对应的用户数据是一个空
            3. 使用 request.session.flush() ,那么客户端 Cookie 中保存的 sessionid 首先会被删除,其次通过
              sessionid 值保存的用户数据也会被全部删除。
      4. 如何设置有效期设置cookie

        1. 设置Session的有效时间
          • value :有效时间
          • 为整数时:将在value为秒单位之后过期
          • 为0时:将在用户关闭浏览器之后过期。
          • 为None时:使用全局过期的设置,默认为两个星期,14天。
          • 为datetime时:在这个指定时间后过期。
        2. 返回距离过期还剩下的秒数
          • 代码:
            1. request.session.get_expiry_age()
        3. 清除过期的 Session 会话
          • 代码:
            1. request.session.clear_expired()
        4. 代码展示:
          • 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')
          • 注意:
            1. 用户在第一次访问时,会走 else 分支
            2. 因为此时还没有任何服务端的 Session 及客户端的 Cookie 值设定
            3. 所以我们通过 request.session[Key] 的方式来设置一个 Session 值,值为 TEST
            4. 当用户第二次访问时将展示出所设置好的Session值及在客户端浏览器中存储的sessionid

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.

< PreviousPost
随机数模块
NextPost >
python花式读取大文件
CATALOG