Source code for picobox.ext.flaskscopes
"""Scopes for Flask framework."""
import uuid
import flask
import picobox
class _flaskscope(picobox.Scope):
"""A base class for Flask scopes."""
_store = None
def __init__(self):
# Both application and request scopes are merely proxies to
# corresponding storage objects in Flask. This means multiple
# scope instances will share the same storage object under the
# hood, and this is not what we want. So we need to generate
# some unique key per scope instance and use that key to
# distinguish dependencies stored by different scope instances.
self._uuid = str(uuid.uuid4())
def set(self, key, value):
try:
dependencies = self._store.__dependencies__
except AttributeError:
dependencies = self._store.__dependencies__ = {}
try:
dependencies = dependencies[self._uuid]
except KeyError:
dependencies = dependencies.setdefault(self._uuid, {})
dependencies[key] = value
def get(self, key):
try:
rv = self._store.__dependencies__[self._uuid][key]
except (AttributeError, KeyError):
raise KeyError(key)
return rv
[docs]
class application(_flaskscope):
"""Share instances across the same Flask (HTTP) application.
In most cases can be used interchangeably with :class:`picobox.singleton`
scope. Comes around when you have `multiple Flask applications`__ and you
want to have independent instances for each Flask application, despite
the fact they are running in the same WSGI context.
.. __: http://flask.pocoo.org/docs/1.0/patterns/appdispatch/
.. versionadded:: 2.2
"""
@property
def _store(self):
return flask.current_app
[docs]
class request(_flaskscope):
"""Share instances across the same Flask (HTTP) request.
.. versionadded:: 2.2
"""
@property
def _store(self):
return flask.g