Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

session.py 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.backends.database.session
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. SQLAlchemy sessions.
  6. """
  7. from __future__ import absolute_import
  8. from billiard.util import register_after_fork
  9. from sqlalchemy import create_engine
  10. from sqlalchemy.ext.declarative import declarative_base
  11. from sqlalchemy.orm import sessionmaker
  12. from sqlalchemy.pool import NullPool
  13. ResultModelBase = declarative_base()
  14. __all__ = ['SessionManager']
  15. class SessionManager(object):
  16. def __init__(self):
  17. self._engines = {}
  18. self._sessions = {}
  19. self.forked = False
  20. self.prepared = False
  21. register_after_fork(self, self._after_fork)
  22. def _after_fork(self,):
  23. self.forked = True
  24. def get_engine(self, dburi, **kwargs):
  25. if self.forked:
  26. try:
  27. return self._engines[dburi]
  28. except KeyError:
  29. engine = self._engines[dburi] = create_engine(dburi, **kwargs)
  30. return engine
  31. else:
  32. kwargs['poolclass'] = NullPool
  33. return create_engine(dburi, **kwargs)
  34. def create_session(self, dburi, short_lived_sessions=False, **kwargs):
  35. engine = self.get_engine(dburi, **kwargs)
  36. if self.forked:
  37. if short_lived_sessions or dburi not in self._sessions:
  38. self._sessions[dburi] = sessionmaker(bind=engine)
  39. return engine, self._sessions[dburi]
  40. else:
  41. return engine, sessionmaker(bind=engine)
  42. def prepare_models(self, engine):
  43. if not self.prepared:
  44. ResultModelBase.metadata.create_all(engine)
  45. self.prepared = True
  46. def session_factory(self, dburi, **kwargs):
  47. engine, session = self.create_session(dburi, **kwargs)
  48. self.prepare_models(engine)
  49. return session()