Skip to content

Instantly share code, notes, and snippets.

@methane
Created January 31, 2012 12:00
Show Gist options
  • Select an option

  • Save methane/1710122 to your computer and use it in GitHub Desktop.

Select an option

Save methane/1710122 to your computer and use it in GitHub Desktop.

Revisions

  1. methane revised this gist Jan 31, 2012. 1 changed file with 5 additions and 2 deletions.
    7 changes: 5 additions & 2 deletions flask_memcache.py
    Original file line number Diff line number Diff line change
    @@ -1,8 +1,9 @@
    """Flask extension utility."""

    from flask.sessions import SessionInterface, SessionMixin
    from werkzeug.contrib.cache import MemcachedCache

    import memcache # Use https://code.launchpad.net/~songofacandy/python-memcached/mixin-threading
    memcache.Client = memcache.LockingClient

    def setup_cache(app):
    """
    @@ -11,7 +12,9 @@ def setup_cache(app):
    # TODO: Support other cache type.
    servers = app.config.get('MEMCACHED_SERVERS', '').split()
    if not servers:
    servers = None
    servers = ['localhost:11211']
    servers = memcache.LockingClient(servers)

    prefix = app.config.get('MEMCACHED_PREFIX', '')
    app.cache = MemcachedCache(servers=servers, key_prefix=prefix)

  2. methane created this gist Jan 31, 2012.
    60 changes: 60 additions & 0 deletions flask_memcache.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,60 @@
    from flask.sessions import SessionInterface, SessionMixin
    from werkzeug.contrib.cache import MemcachedCache

    import memcache # Use https://code.launchpad.net/~songofacandy/python-memcached/mixin-threading
    memcache.Client = memcache.LockingClient

    def setup_cache(app):
    """
    Setup ``app.cache``.
    """
    # TODO: Support other cache type.
    servers = app.config.get('MEMCACHED_SERVERS', '').split()
    if not servers:
    servers = None
    prefix = app.config.get('MEMCACHED_PREFIX', '')
    app.cache = MemcachedCache(servers=servers, key_prefix=prefix)


    class CacheSession(dict, SessionMixin):
    def __init__(self, session_key):
    self._session_key = session_key

    class CacheSessionInterface(SessionInterface):
    """
    Store session in ``app.cache``
    """
    def __init__(self, key, prefix='session-'):
    SessionInterface.__init__(self)
    self._key_func = key
    self._prefix = prefix

    def open_session(self, app, request):
    cache = app.cache
    try:
    _key = self._prefix + self._key_func(request)
    except Exception:
    return None
    obj = cache.get(_key)
    if obj is None:
    obj = CacheSession(_key)
    return obj

    def save_session(self, app, session, response):
    cache = app.cache
    _key = session._session_key
    cache.set(_key, session, timeout=0)


    # Example:
    # app.config.update(MEMCACHED_SERVERS='localhost:11211 localhost:11212',
    # MEMCACHED_PREFIX ='app32-',
    # )
    # setup_cache(app)
    # app.session_interface = CacheSessionInterface(
    # key=lambda req: req.args.get('opensocial_viewer_id'),
    # )
    # # Use cache.
    # app.cache.set('foo', 'bar')
    # # Use session
    # flask.session.set('foo', 'bar')