Django

Code

Ticket #2548: session_middleware.9.diff

File session_middleware.9.diff, 4.3 kB (added by upadhyay@gmail.com, 1 year ago)

[Looks like I am not going to stop embaressing myself today.] Updated the docs too.

  • AUTHORS

    old new  
    229229    Karen Tracey <graybark@bellsouth.net> 
    230230    Makoto Tsuyuki <mtsuyuki@gmail.com> 
    231231    tt@gurgle.no 
    232     Amit Upadhyay 
     232    Amit Upadhyay <http://www.amitu.com/blog/> 
    233233    Geert Vanderkelen 
    234234    viestards.lists@gmail.com 
    235235    Milton Waddams 
  • django/contrib/sessions/middleware.py

    old new  
    4848    def delete_test_cookie(self): 
    4949        del self[TEST_COOKIE_NAME] 
    5050 
     51    def set_life(self, val): 
     52        """  
     53            sets the life of the session, irrespective of global settings.  
     54            val is in seconds.  
     55        """ 
     56        self["_expires_on"] = TILL_BROWSER_CLOSE 
     57 
    5158    def _get_session(self): 
    5259        # Lazily loads session from storage. 
    5360        self.accessed = True 
     
    9299                    obj = Session.objects.get_new_session_object() 
    93100                    session_key = obj.session_key 
    94101 
    95                 if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE: 
    96                     max_age = None 
    97                     expires = None 
    98                 else: 
    99                     max_age = settings.SESSION_COOKIE_AGE 
    100                     expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT") 
    101                 new_session = Session.objects.save(session_key, request.session._session, 
    102                     datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE)) 
    103                 response.set_cookie(settings.SESSION_COOKIE_NAME, session_key, 
     102                now = datetime.datetime.now() 
     103                delta_yield = now + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE) 
     104                if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE and not request.session.get("_expires_on"): 
     105                    max_age = None  
     106                    expires = None  
     107                else:  
     108                    delta_yield = request.session.get("_expires_on", delta_yield) 
     109                    max_age_timedelta = delta_yield - now 
     110                    max_age = max_age_timedelta.days * 24 * 60 * 60 + max_age_timedelta.seconds 
     111                    expires = datetime.datetime.strftime(delta_yield, "%a, %d-%b-%Y %H:%M:%S GMT") 
     112                Session.objects.save(session_key, request.session._session, delta_yield) 
     113                response.set_cookie( 
     114                    settings.SESSION_COOKIE_NAME, session_key, 
    104115                    max_age=max_age, expires=expires, domain=settings.SESSION_COOKIE_DOMAIN, 
    105                     secure=settings.SESSION_COOKIE_SECURE or None) 
     116                    secure=settings.SESSION_COOKIE_SECURE or None 
     117                ) 
    106118        return response 
  • docs/sessions.txt

    old new  
    5858 
    5959    * ``items()`` 
    6060 
    61 It also has these three methods: 
     61It also has these four methods: 
    6262 
    6363    * ``set_test_cookie()`` 
    6464      Sets a test cookie to determine whether the user's browser supports 
     
    7575    * ``delete_test_cookie()`` 
    7676      Deletes the test cookie. Use this to clean up after yourself. 
    7777 
     78    * ``set_life(val)`` 
     79      It takes an integer, number of seconds for which the session should be  
     80      valid. It can also take django.contrib.session.models.TILL_BROWSER_CLOSE,  
     81      that will quell the session at the close of browser. Calling set_life  
     82      will overwrite the global/default session expiry policy. See  
     83      `browser-length sessions vs. persistent sessions` for default session expiry 
     84      policy. 
     85 
    7886You can edit ``request.session`` at any point in your view. You can edit it 
    7987multiple times. 
    8088 
     
    217225her browser. Use this if you want people to have to log in every time they open 
    218226a browser. 
    219227 
     228These settings are global defaults, and can be overwritten by explicitly calling 
     229``request.session.set_life()`` as described above. 
     230 
    220231Clearing the session table 
    221232========================== 
    222233