Source code for panel.io.session
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
from bokeh.document import Document
from bokeh.server.contexts import BokehSessionContext, _RequestProxy
from bokeh.server.session import ServerSession
from bokeh.settings import settings
from bokeh.util.token import generate_jwt_token, generate_session_id
if TYPE_CHECKING:
from bokeh.document.events import DocumentPatchedEvent
from bokeh.server.callbacks import SessionCallback
log = logging.getLogger(__name__)
[docs]class ServerSessionStub(ServerSession):
"""
Stubs out ServerSession methods since the session is only used for
warming up the cache.
"""
def _document_patched(self, event: DocumentPatchedEvent) -> None:
return
def _session_callback_added(self, event: SessionCallback):
return
def _session_callback_removed(self, event):
return
def generate_session(application, request=None, payload=None, initialize=True):
secret_key = settings.secret_key_bytes()
sign_sessions = settings.sign_sessions()
session_id = generate_session_id(
secret_key=secret_key,
signed=sign_sessions
)
payload = payload or {}
token = generate_jwt_token(
session_id,
secret_key=secret_key,
signed=sign_sessions,
extra_payload=payload
)
doc = Document()
session_context = BokehSessionContext(
session_id,
None,
doc
)
session_context._request = _RequestProxy(
request,
arguments=payload.get('arguments'),
cookies=payload.get('cookies'),
headers=payload.get('headers')
)
session_context._token = token
doc._session_context = lambda: session_context
if initialize:
application.initialize_document(doc)
# We have to unset any session callbacks so bokeh does not attempt
# to schedule them on the event loop
callbacks = doc.callbacks._session_callbacks
doc.callbacks._session_callbacks = set()
session = ServerSessionStub(session_id, doc, io_loop=None, token=token)
doc.callbacks._session_callbacks = callbacks
return session