def __init__(self): self.__request_context_scope = \ _create_scoped_session(scope_func=SessionContext._request_context_scope_func) self.__thread_local_scope = \ _create_scoped_session() self.__observable = Observable()
def __init__(self, values=None, immutables=None): self.__active = False self.__store = dict() if values is None else values.copy() self.__immutables = set() if immutables is None else immutables.copy() self.__observable = Observable()
class SessionContext(object): def __init__(self): self.__request_context_scope = \ _create_scoped_session(scope_func=SessionContext._request_context_scope_func) self.__thread_local_scope = \ _create_scoped_session() self.__observable = Observable() def __call__(self, *args, **kwargs): if self.request_context_scoped: session = self.__request_context_scope() else: session = self.__thread_local_scope() return self._init_session(session) @property def request_context_scoped(self): return RequestContextManager.active() def remove(self): if self.request_context_scoped: self.__request_context_scope.remove() else: self.__thread_local_scope.remove() # call listeners on removed event self.__observable("removed", None) def _init_session(self, session): # add register after commit method to the session if not hasattr(session, "register_after_commit"): session.after_commit_callbacks = [] session.register_after_commit = lambda cb, handle_error=False: \ session.after_commit_callbacks.append((cb, handle_error)) # call listeners on created event self.__observable("created", session) return session @staticmethod def _request_context_scope_func(): request_context = RequestContextManager.get_context() if not request_context.contains_listener( SessionContext._request_context_session_release): request_context.register_listener( SessionContext._request_context_session_release) return request_context.id @staticmethod def _request_context_session_release(event, context): # remove sessions on deactivate events if event == "deactivate": try: Session.remove() except: logger.warn( "Failed to remove db session from request context: %s", context.id) def contains_listener(self, listener): return listener in self.__observable def register_listener(self, listener): self.__observable.register(listener)
class RequestContext(MutableMapping): def __init__(self, values=None, immutables=None): self.__active = False self.__store = dict() if values is None else values.copy() self.__immutables = set() if immutables is None else immutables.copy() self.__observable = Observable() def __contains__(self, item): return item in self.__store def __len__(self): return len(self.__store) def __getitem__(self, item): return self.__store[item] def __delitem__(self, key): self.__check_immutable(key) del self.__store[key] def __setitem__(self, key, value): self.__check_immutable(key) self.__store[key] = value def __iter__(self): return iter(self.__store) @property def active(self): return self.__active @property def id(self): return id(self) def __check_immutable(self, key): if key in self.__immutables: raise ValueError("The value is immutable and cannot be changed.") def clone(self): """ Clones the RequestContext creating a new RequestContext with the data copied from the original. Observables / callbacks are not copied in the cloning process. :return: a new RequestContext """ return RequestContext(values=self.__store, immutables=self.__immutables) def immutable(self, key, value): """Sets the given value and makes it immutable for the lifetime of the request context. If someone tries to change the value then a ValueError is raised. """ self.__check_immutable(key) self[key] = value self.__immutables.add(key) def contains_listener(self, listener): return listener in self.__observable def register_listener(self, listener): self.__observable.register(listener) def _activate(self): _request_store.context = self self.__active = True self.__observable("activate", self) def _release(self): if self.__active: # fire listener first because listeners may depend on # request to perform cleanup work self.__observable("deactivate", self) _request_store.release() self.__active = False
def __init__(self): self.__active = False self.__store = dict() self.__immutable = set() self.__observable = Observable()
class RequestContext(MutableMapping): def __init__(self): self.__active = False self.__store = dict() self.__immutable = set() self.__observable = Observable() def __contains__(self, item): return item in self.__store def __len__(self): return len(self.__store) def __getitem__(self, item): return self.__store[item] def __delitem__(self, key): self.__check_immutable(key) del self.__store[key] def __setitem__(self, key, value): self.__check_immutable(key) self.__store[key] = value def __iter__(self): return iter(self.__store) @property def active(self): return self.__active @property def id(self): return id(self) def __check_immutable(self, key): if key in self.__immutable: raise ValueError("The value is immutable and cannot be changed.") def immutable(self, key, value): """Sets the given value and makes it immutable for the lifetime of the request context. If someone tries to change the value then a ValueError is raised. """ self.__check_immutable(key) self[key] = value self.__immutable.add(key) def contains_listener(self, listener): return listener in self.__observable def register_listener(self, listener): self.__observable.register(listener) def _activate(self): _request_store.context = self self.__active = True self.__observable("activate", self) def _release(self): if self.__active: # fire listener first because listeners may depend on # request to perform cleanup work self.__observable("deactivate", self) _request_store.release() self.__active = False
class SessionContext(object): def __init__(self): self.__request_context_scope = \ _create_scoped_session(scope_func=SessionContext._request_context_scope_func) self.__thread_local_scope = \ _create_scoped_session() self.__observable = Observable() def __call__(self, *args, **kwargs): if self.request_context_scoped: session = self.__request_context_scope() else: session = self.__thread_local_scope() return self._init_session(session) @property def request_context_scoped(self): return RequestContextManager.active() def remove(self): if self.request_context_scoped: self.__request_context_scope.remove() else: self.__thread_local_scope.remove() # call listeners on removed event self.__observable("removed", None) def _init_session(self, session): # add register after commit method to the session if not hasattr(session, "register_after_commit"): session.after_commit_callbacks = [] session.register_after_commit = lambda cb, handle_error=False: \ session.after_commit_callbacks.append((cb, handle_error)) # call listeners on created event self.__observable("created", session) return session @staticmethod def _request_context_scope_func(): request_context = RequestContextManager.get_context() if not request_context.contains_listener(SessionContext._request_context_session_release): request_context.register_listener(SessionContext._request_context_session_release) return request_context.id @staticmethod def _request_context_session_release(event, context): # remove sessions on deactivate events if event == "deactivate": try: Session.remove() except: logger.warn("Failed to remove db session from request context: %s", context.id) def contains_listener(self, listener): return listener in self.__observable def register_listener(self, listener): self.__observable.register(listener)