• Django中的Session与Cookie


    1、相同与不同

      Cookie和Session都是为了记录用户相关信息的方式,

      最大的区别就是Cookie在客户端记录而Session在服务端记录内容。

    2、Cookie和Session之间的联系的建立:

      对于Django默认情况来说,当用户登陆后就可以发现Cookie里油一个sessionid的字段,根据这个key就可以取得在服务端记录的详细内容。

      如果将这个字段删除,刷新页面就会变成未登录状态了。

    对session的处理主要在源码django/contrib/sessions/middleware.py中,如下所示:

    import time
    from importlib import import_module
    from django.conf import settings
    from django.contrib.sessions.backends.base import UpdateError
    from django.core.exceptions import SuspiciousOperation
    from django.utils.cache import patch_vary_headers
    from django.utils.deprecation import MiddlewareMixin
    from django.utils.http import cookie_date
    class SessionMiddleware(MiddlewareMixin):
     def __init__(self, get_response=None):
      self.get_response = get_response
      engine = import_module(settings.SESSION_ENGINE)
      self.SessionStore = engine.SessionStore
     def process_request(self, request):
      session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
      request.session = self.SessionStore(session_key)
     def process_response(self, request, response):
      """
      If request.session was modified, or if the configuration is to save the
      session every time, save the changes and set a session cookie or delete
      the session cookie if the session has been emptied.
      """
      try:
       accessed = request.session.accessed
       modified = request.session.modified
       empty = request.session.is_empty()
      except AttributeError:
       pass
      else:
       # First check if we need to delete this cookie.
       # The session should be deleted only if the session is entirely empty
       if settings.SESSION_COOKIE_NAME in request.COOKIES and empty:
        response.delete_cookie(
         settings.SESSION_COOKIE_NAME,
         path=settings.SESSION_COOKIE_PATH,
         domain=settings.SESSION_COOKIE_DOMAIN,
        )
       else:
        if accessed:
         patch_vary_headers(response, ('Cookie',))
        if (modified or settings.SESSION_SAVE_EVERY_REQUEST) and not empty:
         if request.session.get_expire_at_browser_close():
          max_age = None
          expires = None
         else:
          max_age = request.session.get_expiry_age()
          expires_time = time.time() + max_age
          expires = cookie_date(expires_time)
         # Save the session data and refresh the client cookie.
         # Skip session save for 500 responses, refs #3881.
         if response.status_code != 500:
          try:
           request.session.save()
          except UpdateError:
           raise SuspiciousOperation(
            "The request's session was deleted before the "
            "request completed. The user may have logged "
            "out in a concurrent request, for example."
           )
          response.set_cookie(
           settings.SESSION_COOKIE_NAME,
           request.session.session_key, max_age=max_age,
           expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
           path=settings.SESSION_COOKIE_PATH,
           secure=settings.SESSION_COOKIE_SECURE or None,
           httponly=settings.SESSION_COOKIE_HTTPONLY or None,
          )
      return response
    View Code

    当接收到一个请求的时候,先在Cookie中取出key,然后根据key创建Session对象,在response时候判断是否要删除或者修改sessionid。

    也就是说,Django中如果客户把浏览器Cookie禁用后,用户相关的功能就全都失效了,因为服务器端根本没法知道当前用户是谁。

    对于这种情况,关键点就是如何把sessionid不使用Cookie传递给客户端,常见的比如放在URL中,也就是URL重写技术。想实现这点可以自己写Middleware。不过django并不建议这么做:

    The Django sessions framework is entirely, and solely, cookie-based. It does not fall back to putting session IDs in URLs as a last resort, as PHP does. This is an intentional design decision. Not only does that behavior make URLs ugly, it makes your site vulnerable to session-ID theft via the “Referer” header.

    转载自:https://www.jb51.net/article/119892.htm

  • 相关阅读:
    leetcode1118
    Kaggle练习002--Predict survival on the Titanic(Titanic Disaster)
    leetcode1111
    leetcode1110
    leetcode1109
    练习题|网络编程-socket开发
    web网页练习
    Bootstrap框架
    JQuery框架2.位置属性|筛选方法|事件
    Jquery框架1.选择器|效果图|属性、文档操作
  • 原文地址:https://www.cnblogs.com/LYliangying/p/9662314.html
Copyright © 2020-2023  润新知