From 354798a8530836c9007b97fa566c9d066d58b4ea Mon Sep 17 00:00:00 2001 From: Wim De Clercq Date: Thu, 18 Jul 2024 10:21:13 +0200 Subject: [PATCH] Guarantee a session factory to be set. Issue #891 --- atramhasis/__init__.py | 38 ++++++++++++++++++++++++++++++++++++++ tests/test_views.py | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/atramhasis/__init__.py b/atramhasis/__init__.py index 09026f24..a3ef2a57 100644 --- a/atramhasis/__init__.py +++ b/atramhasis/__init__.py @@ -1,10 +1,16 @@ +import logging import os from pyramid.config import Configurator +from pyramid.config import PHASE3_CONFIG +from pyramid.interfaces import ISessionFactory +from pyramid.session import SignedCookieSessionFactory from pyramid.settings import aslist from atramhasis.renderers import json_renderer_verbose +LOG = logging.getLogger(__name__) + DEFAULT_SETTINGS = { "cache.tree.backend": "dogpile.cache.memory", @@ -47,6 +53,38 @@ def includeme(config): config.scan() +def configure_session(config): + """ + Configure pyramid's session factory. + + People can configure their own session factory, but if no factory is registered + atramhasis will try configuring its own. + """ + + def check_session_factory_set(): + session_factory = config.registry.queryUtility(ISessionFactory) + if session_factory: + return + + settings = config.registry.settings + if 'atramhasis.session_factory.secret' not in settings: + msg = ( + 'No session factory is configured, and ' + 'atramhasis.session_factory.secret setting is missing.' + ) + raise ValueError(msg) + + LOG.info('Using default SignedCookieSessionFactory.') + default_session_factory = SignedCookieSessionFactory( + settings['atramhasis.session_factory.secret'] + ) + config.registry.registerUtility(default_session_factory, ISessionFactory) + + config.action( + 'check_session_factory_set', check_session_factory_set, order=PHASE3_CONFIG + 1 + ) + + def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ diff --git a/tests/test_views.py b/tests/test_views.py index ee41cb70..5d79157b 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -658,7 +658,7 @@ def __init__(self): def setUp(self): pyramid_settings = Settings(settings) config = testing.setUp(settings=pyramid_settings) - atramhasis.load_app(config, pyramid_settings) + atramhasis.load_app(config) self.request = DummyRequest() self.request.application_url = "http://localhost:6543" apply_request_extensions(self.request)