Source code for sanic_cookiesession

# -*- coding: utf-8 -*-
import logging
from itsdangerous import URLSafeTimedSerializer, BadSignature

__version__ = '0.3.1'

__all__ = ['setup']

log = logging.getLogger(__name__)


[docs] def setup(app, session_type=dict, serializer_type=URLSafeTimedSerializer): """Setup cookie-based session for :code:`Sanic` application""" secret_key = app.config.get('SESSION_COOKIE_SECRET_KEY') if not secret_key: secret_key = app.config.get('SECRET_KEY') if not secret_key: raise RuntimeError( 'either SESSION_COOKIE_SECRET_KEY or SECRET_KEY must be set') setdefault = app.config.setdefault cookie_name = setdefault('SESSION_COOKIE_NAME', '_session') domain = setdefault('SESSION_COOKIE_DOMAIN', None) httponly = setdefault('SESSION_COOKIE_HTTPONLY', True) max_age = setdefault('SESSION_COOKIE_MAX_AGE', 86400) salt = setdefault('SESSION_COOKIE_SALT', 'cookie-session') secure = setdefault('SESSION_COOKIE_SECURE', True) session_name = setdefault('SESSION_NAME', 'session') serializer = serializer_type(secret_key, salt=salt) @app.on_request async def load_session(request): if hasattr(request.ctx, session_name): return session_cookie = request.cookies.get(cookie_name) if session_cookie: try: session = serializer.loads(session_cookie, max_age=max_age) except BadSignature as ex: log.warning('%s - %s', ex, ex.payload) session = session_type() else: session = session_type() setattr(request.ctx, session_name, session) @app.on_response async def save_session(request, response): session = getattr(request.ctx, session_name, None) if session is None: setattr(request.ctx, session_name, session := session_type()) kwargs = { "httponly": httponly, "max_age": max_age, "secure": secure } if domain: kwargs["domain"] = domain response.add_cookie(cookie_name, serializer.dumps(session), **kwargs)