Skip to content

Commit 2d104c2

Browse files
committed
Merge branch 'flask-session' into 'main'
Server-side sessions support See merge request yaal/canaille!309
2 parents 2980463 + 3fcf65a commit 2d104c2

File tree

6 files changed

+45
-7
lines changed

6 files changed

+45
-7
lines changed

CHANGES.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
Added
55
^^^^^
66
- OIDC ``amr`` claim support. :issue:`302`
7+
- Server-side sessions.
78

89
[0.1.0] - 2025-11-13
910
--------------------

canaille/app/configuration.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from dataclasses import dataclass
66
from typing import Annotated
77
from typing import Any
8+
from typing import Literal
89

910
from pydantic import AmqpDsn
1011
from pydantic import BaseModel as PydanticBaseModel
@@ -212,6 +213,36 @@ def guess_broker(cls, v, info):
212213
- ``P1DT12H`` for 1 day and 12 hours
213214
"""
214215

216+
SESSION_TYPE: (
217+
Literal[
218+
"redis",
219+
"memcached",
220+
"filesystem",
221+
"sqlalchemy",
222+
"mongodb",
223+
"cachelib",
224+
"dynamodb",
225+
]
226+
| None
227+
) = None
228+
"""The Flask-Session backend type.
229+
230+
If ``None`` (default), Flask's default session implementation is used (client-side signed cookies).
231+
When set, sessions are stored server-side using the specified backend.
232+
233+
Available backends:
234+
235+
- ``redis``: Store sessions in Redis (connects to localhost:6379 by default)
236+
- ``memcached``: Store sessions in Memcached (connects to localhost:11211 by default)
237+
- ``filesystem``: Store sessions in local files (uses /tmp/flask-session by default)
238+
- ``sqlalchemy``: Store sessions in a SQL database
239+
- ``mongodb``: Store sessions in MongoDB
240+
- ``cachelib``: Store sessions using a cachelib backend
241+
- ``dynamodb``: Store sessions in DynamoDB
242+
243+
See the :doc:`Flask-Session documentation <flask-session:index>` for backend-specific details.
244+
"""
245+
215246

216247
def settings_factory(
217248
config=None,

canaille/app/flask.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from flask import url_for
1616
from flask_caching import Cache
1717
from flask_dramatiq import Dramatiq
18+
from flask_session import Session
1819
from flask_wtf.csrf import CSRFProtect
1920
from werkzeug.exceptions import HTTPException
2021
from werkzeug.routing import BaseConverter
@@ -26,6 +27,7 @@
2627

2728
csrf = CSRFProtect()
2829
cache = Cache()
30+
session_store = Session()
2931
dramatiq = Dramatiq(
3032
config_prefix="BROKER",
3133
middleware=[
@@ -198,6 +200,8 @@ def setup_flask(app) -> None:
198200

199201
csrf.init_app(app)
200202
cache.init_app(app)
203+
if app.config.get("SESSION_TYPE"):
204+
session_store.init_app(app)
201205

202206
# dirty warning silencing for the testsuite
203207
dramatiq.app = None

doc/conf.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def __getattr__(cls, name):
8080
"flask-dramatiq": ("https://flask-dramatiq.readthedocs.io/en/latest", None),
8181
"flask-babel": ("https://python-babel.github.io/flask-babel", None),
8282
"flask-caching": ("https://flask-caching.readthedocs.io/en/latest/", None),
83+
"flask-session": ("https://flask-session.readthedocs.io/en/latest", None),
8384
"flask-wtf": ("https://flask-wtf.readthedocs.io", None),
8485
"hypercorn": ("https://hypercorn.readthedocs.io/en/latest", None),
8586
"jinja": ("https://jinja.palletsprojects.com", None),

pyproject.toml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,13 @@ dependencies = [
3434
"click>=8.2.0",
3535
"flask >= 3.0.0",
3636
"flask-caching>=2.3.0",
37+
"flask-session>=0.8.0",
3738
"flask-wtf >= 1.2.1",
38-
"pydantic-settings >= 2.8.0",
3939
"httpx>=0.28.1",
4040
"wtforms >= 3.1.1",
4141
"flask-dramatiq>=0.6.0",
4242
"dramatiq>=1.18.0",
4343
"dramatiq-eager-broker>=0.1.0",
44-
"pika>=1.3.2",
4544
]
4645

4746
[project.optional-dependencies]
@@ -63,10 +62,10 @@ oidc = [
6362
]
6463

6564
scim = [
66-
"httpx>=0.28.1",
67-
"scim2-models>=0.4.0",
6865
"authlib >= 1.5.1",
66+
"httpx>=0.28.1",
6967
"scim2-client>=0.5.1",
68+
"scim2-models>=0.4.0",
7069
]
7170

7271
ldap = [

uv.lock

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)