From a5486e29705afeb5c018cabd4bf9d9db8f4c556f Mon Sep 17 00:00:00 2001 From: Wim De Clercq Date: Thu, 18 Jul 2024 10:21:13 +0200 Subject: [PATCH 1/2] Guarantee a session factory to be set. Issue #891 --- atramhasis/__init__.py | 46 ++++++++++++++++++++++++++++++++++++------ tests/test_views.py | 2 +- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/atramhasis/__init__.py b/atramhasis/__init__.py index 09026f24..9f3ae603 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. """ @@ -58,14 +96,10 @@ def main(global_config, **settings): config = Configurator(settings=settings) - return load_app(config, settings) - + return load_app(config) -def load_app(config, settings): - from pyramid.session import SignedCookieSessionFactory - atramhasis_session_factory = SignedCookieSessionFactory(settings['atramhasis.session_factory.secret']) - config.set_session_factory(atramhasis_session_factory) +def load_app(config): includeme(config) config.include('atramhasis.data:db') 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) From 3cb50c9e0ce605149a99996e8dd2580d0918a174 Mon Sep 17 00:00:00 2001 From: Wim De Clercq Date: Fri, 19 Jul 2024 16:15:55 +0200 Subject: [PATCH 2/2] Review fix. --- atramhasis/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atramhasis/__init__.py b/atramhasis/__init__.py index 9f3ae603..a74f60df 100644 --- a/atramhasis/__init__.py +++ b/atramhasis/__init__.py @@ -34,7 +34,7 @@ def includeme(config): for key, value in DEFAULT_SETTINGS.items(): if key not in settings: settings[key] = value - + configure_session(config) config.include('pyramid_jinja2') config.include('pyramid_tm') config.add_static_view('static', 'static', cache_max_age=3600)