Changeset ac64833 in rattail


Ignore:
Timestamp:
08/03/2022 03:14:45 PM (6 months ago)
Author:
Lance Edgar <lance@…>
Branches:
master
Children:
de40a21
Parents:
68b3011
Message:

Add initial support for Beaker caching of config values from DB

refs #8

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • rattail/app.py

    r68b3011 rac64833  
    239239        setting.value = value
    240240
     241        # invalidate beaker config cache for this setting, if applicable
     242        self.config.beaker_invalidate_setting(name)
     243
    241244    def delete_setting(self, session, name, **kwargs):
    242245        model = self.model
     
    882885
    883886        folders = [
     887            'cache',
    884888            'data',
    885889            os.path.join('data', 'uploads'),
    886890            'log',
     891            # TODO: deprecate / remove this
    887892            'sessions',
    888893            'work',
  • rattail/config.py

    r68b3011 rac64833  
    143143        self.versioning_has_been_enabled = False
    144144
     145        # should we use beaker caching?
     146        self.beaker_caching = self.getbool('rattail.config', 'beaker_cache.enabled',
     147                                           usedb=False, default=False)
     148        if self.beaker_caching:
     149            from beaker.cache import CacheManager
     150            from beaker.util import parse_cache_config_options
     151
     152            options = {
     153                'cache.type': self.get(
     154                    'rattail.config', 'beaker_cache.type',
     155                    usedb=False,
     156                    default='file'),
     157                'cache.data_dir': self.get(
     158                    'rattail.config', 'beaker_cache.data_dir',
     159                    usedb=False,
     160                    default=os.path.join(self.appdir(), 'cache', 'config', 'data')),
     161                'cache.lock_dir': self.get(
     162                    'rattail.config', 'beaker_cache.lock_dir',
     163                    usedb=False,
     164                    default=os.path.join(self.appdir(), 'cache', 'config', 'lock')),
     165            }
     166
     167            self.beaker_cache_manager = CacheManager(
     168                **parse_cache_config_options(options))
     169
     170            self.beaker_config_cache = self.beaker_cache_manager.get_cache(
     171                'rattail.config',
     172                type='file',    # TODO: (why) must we declare this?
     173                expire=3600)
     174
    145175    def read_file(self, path, recurse=True, require=False):
    146176        """
     
    297327        app = self.get_app()
    298328        name = '{}.{}'.format(section, option)
    299         now = app.localtime(tzinfo=False)
     329
     330        if self.beaker_caching:
     331            return self._getdb_beaker(section, option)
    300332
    301333        close = False
     
    311343
    312344        return value
     345
     346    def _getdb_beaker(self, section, option):
     347        """
     348        Retrieve a config value from database settings table.
     349        """
     350        app = self.get_app()
     351        name = '{}.{}'.format(section, option)
     352
     353        def get_value():
     354            # nb. avoid continuum user lookup
     355            session = app.make_session(continuum_user=None)
     356            value = app.get_setting(session, name)
     357            session.close()
     358            return value
     359
     360        return self.beaker_config_cache.get(key=name, createfunc=get_value)
     361
     362    def beaker_invalidate_setting(self, name):
     363        if not self.beaker_caching:
     364            return
     365
     366        # tell beaker to remove the cached value for this setting
     367        self.beaker_config_cache.remove_value(key=name)
    313368
    314369    def setdb(self, section, option, value, session=None):
     
    487542        """
    488543        get = self.require if require else self.get
     544        kwargs.setdefault('usedb', False)
    489545        return get('rattail', 'appdir', **kwargs)
    490546
  • rattail/data/config/web-complete.conf.mako

    r68b3011 rac64833  
    3030
    3131beaker.session.type = file
    32 beaker.session.data_dir = %(here)s/sessions/data
    33 beaker.session.lock_dir = %(here)s/sessions/lock
     32beaker.session.data_dir = %(here)s/cache/sessions/data
     33beaker.session.lock_dir = %(here)s/cache/sessions/lock
    3434beaker.session.secret = ${beaker_secret}
    3535beaker.session.key = ${beaker_key}
  • rattail/data/config/web.conf

    r68b3011 rac64833  
    3333
    3434beaker.session.type = file
    35 beaker.session.data_dir = %(here)s/sessions/data
    36 beaker.session.lock_dir = %(here)s/sessions/lock
     35beaker.session.data_dir = %(here)s/cache/sessions/data
     36beaker.session.lock_dir = %(here)s/cache/sessions/lock
    3737# TODO: you should change this
    3838beaker.session.secret = e:VHDVstO=H1%h1bV><&
  • rattail/data/config/webapi.conf

    r68b3011 rac64833  
    2828
    2929beaker.session.type = file
    30 beaker.session.data_dir = %(here)s/sessions/data
    31 beaker.session.lock_dir = %(here)s/sessions/lock
     30beaker.session.data_dir = %(here)s/cache/sessions/data
     31beaker.session.lock_dir = %(here)s/cache/sessions/lock
    3232# TODO: you should change this
    3333beaker.session.secret = e:VHDVstO=H1%h1bV><&
  • setup.py

    r68b3011 rac64833  
    124124        # Support for multiple migration bases was added in Alembic 0.7.
    125125        'alembic>=0.7.0',               #                       0.7.4
    126 
     126        'beaker',                       # 1.11.0
    127127        # TODO: add support for 1.4.x and later
    128128        'SQLAlchemy<1.4',               # 0.7.6                 1.3.23
Note: See TracChangeset for help on using the changeset viewer.