Django

Code

Changeset 4771

Show
Ignore:
Timestamp:
03/21/07 21:20:33 (1 year ago)
Author:
mtredinnick
Message:

Reduced the chances of session object collision. The window of opportunity is
now about five Python instructions in get_or_create(). This doesn't guarantee
no collisions, but should fix many occurrences. Refs #1180.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/contrib/sessions/middleware.py

    r4680 r4771  
    8484                patch_vary_headers(response, ('Cookie',)) 
    8585            if modified or settings.SESSION_SAVE_EVERY_REQUEST: 
    86                 session_key = request.session.session_key or Session.objects.get_new_session_key() 
     86                if request.session.session_key: 
     87                    session_key = request.session.session_key 
     88                else: 
     89                    obj = Session.objects.get_new_session_object() 
     90                    session_key = obj.session_key 
     91 
    8792                if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE: 
    8893                    max_age = None 
  • django/trunk/django/contrib/sessions/models.py

    r4265 r4771  
    1 import base64, md5, random, sys 
     1import base64, md5, random, sys, datetime 
    22import cPickle as pickle 
    33from django.db import models 
     
    2323                break 
    2424        return session_key 
     25 
     26    def get_new_session_object(self): 
     27        """ 
     28        Returns a new session object. 
     29        """ 
     30        # FIXME: There is a *small* chance of collision here, meaning we will 
     31        # return an existing object. That can be fixed when we add a way to 
     32        # validate (and guarantee) that non-auto primary keys are unique. For 
     33        # now, we save immediately in order to reduce the "window of 
     34        # misfortune" as much as possible. 
     35        created = False 
     36        while not created: 
     37            obj, created = self.get_or_create(session_key=self.get_new_session_key(), 
     38                    expire_date = datetime.datetime.now()) 
     39            # Collision in key generation, so re-seed the generator 
     40            random.seed() 
     41        return obj 
    2542 
    2643    def save(self, session_key, session_dict, expire_date):