Metadata-Version: 2.4
Name: kaya-session-memcache
Version: 0.0.1
Summary: Memcached-backed session storage for the Kaya lightweight ASGI web framework
Author-email: Walter Oggioni <oggioni.walter@gmail.com>
License-Expression: MIT
Project-URL: Homepage, https://github.com/woggioni/kaya
Project-URL: Bug Tracker, https://github.com/woggioni/kaya/issues
Classifier: Development Status :: 3 - Alpha
Classifier: Topic :: Utilities
Classifier: Intended Audience :: System Administrators
Classifier: Intended Audience :: Developers
Classifier: Environment :: Console
Classifier: Programming Language :: Python :: 3
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: kaya-session
Requires-Dist: aiomcache>=0.8
Provides-Extra: dev
Requires-Dist: build; extra == "dev"
Requires-Dist: mypy; extra == "dev"
Requires-Dist: ipdb; extra == "dev"
Requires-Dist: twine; extra == "dev"

# kaya-session-memcache

Memcached-backed session storage for the Kaya web framework.

Provides `MemcacheSessionStore`, a `SessionStore` implementation (from
`kaya-session`) that persists session data in memcached via `aiomcache`, so
sessions are shared across processes and hosts.

## Usage

```python
import aiomcache

from kaya.core import KayaApp, HttpContext
from kaya.session import SessionMixin
from kaya.session.memcache import MemcacheSessionStore

client = aiomcache.Client('127.0.0.1', 11211)
session = SessionMixin(MemcacheSessionStore(client))
app = KayaApp(mixins=[session])

@app.GET('/')
async def home(ctx: HttpContext):
    n = ctx.session.get('visits', 0) + 1
    ctx.session['visits'] = n
    await ctx.send_str(200, f'visits: {n}')
```

Sessions are stored under keys with the prefix `kaya:session:` (configurable
via the `prefix` argument). Server-side expiry uses memcached item expiration
and slides on each access when the session mixin passes a `max_age`. TTLs
larger than 30 days are automatically converted to absolute Unix timestamps,
as required by the memcached protocol.

## Serialization

Session data is serialized with `pickle` by default, so arbitrary Python
objects can be stored. A different serializer can be plugged in via the
`dumps`/`loads` arguments:

```python
import json

store = MemcacheSessionStore(
    client,
    dumps=lambda d: json.dumps(d).encode('utf-8'),
    loads=lambda b: json.loads(b.decode('utf-8')),
)
```

**Warning:** pickle deserialization of untrusted data is unsafe. Only use the
default serializer with a trusted memcached server.
