美文网首页
Session、Cookie

Session、Cookie

作者: 好小葱1 | 来源:发表于2018-08-13 10:26 被阅读11次

参考:https://blog.csdn.net/u010429424/article/details/77394778
https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Sessions

HTTP被设计为”无状态”,在一次请求和下一次请求之间没有任何状态保持,服务器无法识别来自同一客户端的连续请求。因此,Cookies和Session应运而生。

1. Cookies

  • Web站点要求保存在客户端(如浏览器)上的二进制数据。
  • 适用情形:验证用户是否登录;实现页面跳转,但不跟踪用户数据。
    def my_set_cookie(request):
      ...
      # set a cookie on the response
      response = HttpResponse()
      response.set_cookie("cookie", {cookie_content})
      ...
    
    def my_get_cookie(request):
      ...
      request.COOKIES["cookie"])
      ...
    

2. Session

session 又叫做“会话”,用于存取会话信息, 这些数据在服务器端存储,并对cookie的收发进行了抽象。 Cookies只存储数据的哈希会话ID,而不是数据本身,从而避免了大部分的常见cookie问题。

  • 流程:
    1. 客户端向服务器发送请求时,看本地是否有cookie文件。如果有,就在HTTP的请求头(Request Headers)中,包含一行cookie信息。
    2. 服务器接收到请求后,根据cookie信息,得到sessionId,根据sessionId找到对应的session,用这个session就能判断出用户是否登录等等。如果session超时被销毁了,那么服务器会生成新的sessionId发回给客户端。客户端收到新的sessionId后,更新本地cookie文件中的信息,下次访问时就会使用新的cookie信息。
  • 在Django中,Session功能通过中间件SessionMiddleware
    1. 在使用过程中,可以像使用字典一样使用它。request.session["password"] = "asdf"
    2. 像Model一样使用它
    from django.contrib.sessions.models import Session
    # session由32字节的Hash串标识,可以用数据库API来存取session
    # session数据存储在数据库表django_session中
    s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceead')
    s.session_data
    
  • session_data是加密的json数据,存储了user_id和其它自定义session
    from django.contrib.sessions.models import Session
    from django.contrib.auth.models import User
    
    session_key = 'pga1ykmzyba4fmv6b34l8c3kbqqynwbt'
    
    session = Session.objects.get(session_key=session_key)
    data = session.get_decoded()
    print data
    
    uid = data.get('_auth_user_id')
    user = User.objects.get(pk=uid)
    
    print user.username, user.get_full_name(), user.email
    
    # 输出
    In [10]: print data
    {'_auth_user_id': 2L, '_auth_user_backend': 'django.contrib.auth.backends.ModelBackend'}
    
    In [11]: print user.username, user.get_full_name(), user.email
    test  
    
  • 适用情形:记录当前用户请求次数,当前登录用户的个数。

相关文章

网友评论

      本文标题:Session、Cookie

      本文链接:https://www.haomeiwen.com/subject/pzsybftx.html