summaryrefslogtreecommitdiffstats
path: root/hyperkitty/lib/store.py
diff options
context:
space:
mode:
authorAurélien Bompard <aurelien@bompard.org>2012-09-12 09:31:21 +0200
committerAurélien Bompard <aurelien@bompard.org>2012-09-12 09:31:21 +0200
commit643a4a97ff7cd5013e25d2eeb6bcc68cf524c1d7 (patch)
tree76dd05d2ed331893eb1e486a2ca0287202c2ac05 /hyperkitty/lib/store.py
parente2160d63f1d07817a6aee7f601666792e243dc2d (diff)
downloadhyperkitty-643a4a97ff7cd5013e25d2eeb6bcc68cf524c1d7.tar.gz
hyperkitty-643a4a97ff7cd5013e25d2eeb6bcc68cf524c1d7.tar.xz
hyperkitty-643a4a97ff7cd5013e25d2eeb6bcc68cf524c1d7.zip
Use a middleware to avoid KS connection leaks
Diffstat (limited to 'hyperkitty/lib/store.py')
-rw-r--r--hyperkitty/lib/store.py64
1 files changed, 64 insertions, 0 deletions
diff --git a/hyperkitty/lib/store.py b/hyperkitty/lib/store.py
new file mode 100644
index 0000000..c20c039
--- /dev/null
+++ b/hyperkitty/lib/store.py
@@ -0,0 +1,64 @@
+"""
+WSGI and Django middlewares for KittyStore
+
+Inspired by http://pypi.python.org/pypi/middlestorm
+"""
+
+from threading import local
+
+from django.conf import settings
+import kittystore
+
+
+class KittyStoreWSGIMiddleware(object):
+ """WSGI middleware.
+ Add KittyStore object in environ['kittystore.store']. Each thread contains
+ own store.
+ """
+
+ def __init__(self, app):
+ """Create WSGI middleware.
+ :param app: top level application or middleware.
+ :param database: instance of Database returned create_database.
+ """
+ self._app = app
+ self._local = local()
+
+ def __call__(self, environ, start_response):
+ try:
+ environ['kittystore.store'] = self._local.store
+ except AttributeError:
+ environ['kittystore.store'] = \
+ self._local.__dict__.setdefault('store',
+ kittystore.get_store(settings.KITTYSTORE_URL))
+ try:
+ return self._app(environ, start_response)
+ finally:
+ environ['kittystore.store'].rollback()
+ #environ['kittystore.store'].close()
+
+
+class KittyStoreDjangoMiddleware(object):
+ """Django middleware.
+ Add KittyStore object in environ['kittystore.store']. Each thread contains
+ own store.
+ """
+
+ def __init__(self):
+ """Create Django middleware."""
+ self._local = local()
+
+ def process_request(self, request):
+ try:
+ request.environ['kittystore.store'] = self._local.store
+ except AttributeError:
+ request.environ['kittystore.store'] = \
+ self._local.__dict__.setdefault('store',
+ kittystore.get_store(settings.KITTYSTORE_URL))
+
+ #def process_response(self, request, response):
+ # request.environ['kittystore.store'].close()
+ # return response
+
+ def process_exception(self, request, exception):
+ request.environ['kittystore.store'].rollback()