Source code for jamweb.session.memcached

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File   : memcached.py
# Author : Jiayuan Mao
# Email  : maojiayuan@gmail.com
# Date   : 10/23/2018
#
# This file is part of Jacinle.
# Distributed under terms of the MIT license.

import collections

from jammy.storage.kv.memcached import MemcachedKVStore

from .session import SessionManagerBase

__all__ = ["MemcachedSessionManager", "MemcachedSessionIdentifier"]


[docs]class MemcachedSessionIdentifier( collections.namedtuple("_MemcachedSessionIdentifier", ["session_id", "hmac_key"]) ): pass
[docs]class MemcachedSessionManager(SessionManagerBase): def __init__( self, secret, memcache_host, memcache_port, timeout, cookie_prefix="jam_ses_", memcached_prefix="jam_sess_", ): # pylint: disable=too-many-arguments super().__init__(secret) self.memcache = MemcachedKVStore(memcache_host, memcache_port) self.session_timeout = timeout self.cookie_prefix = cookie_prefix self.memcached_prefix = memcached_prefix assert self.memcache.available
[docs] def get(self, request_handler): session_id = hmac_key = None if request_handler is not None: session_id = request_handler.get_secure_cookie( self.cookie_prefix + "session_id" ).decode("utf8") hmac_key = request_handler.get_secure_cookie( self.cookie_prefix + "verification" ).decode("utf8") if session_id is None: session_exists = False session_id = self._generate_id() hmac_key = self._generate_hmac(session_id) else: session_exists = True data = {} if session_exists and hmac_key == self._generate_hmac(session_id): data = self.memcache.get( self.memcached_prefix + session_id, data, refresh=True, refresh_timeout=self.session_timeout, ) return MemcachedSessionIdentifier(session_id, hmac_key), data
[docs] def set( self, request_handler, identifier, data ): # pylint: disable=arguments-differ request_handler.set_secure_cookie( self.cookie_prefix + "session_id", identifier.session_id.encode("utf8") ) request_handler.set_secure_cookie( self.cookie_prefix + "verification", identifier.hmac_key.encode("utf8") ) self.memcache.put( self.memcached_prefix + identifier.session_id, data, replace=True, timeout=self.session_timeout, )