Повторно использовать сессию#

Передайте session=, если приложение уже загрузило сохранённую модель. Runtime проверит срок, добавит credential в защищённый запрос и не вызовет login без необходимости.

Фабрика примера принимает ровно один исходный способ: credentials= для нового входа или session= для продолжения. Оба значения связываются с одной USER_SESSION.

# examples/docs/auth_session.py
async def main() -> None:
    site = AuthSite()
    async with mail_sdk(site, session=saved_session()) as sdk:
        account = await sdk.account.get_account()

    print(f"account: {account.id} {account.email}")
    print(f"requests: {len(site.calls)}")

Здесь saved-access ещё действителен, поэтому сеть видит только защищённый GET /account.

BrowserSession разделяет состояние входа между вкладками одного контекста и обновляет его через один BrowserLogin.

<!-- examples/mail/site/app.py -->
<main data-page="mailbox">
  <ul data-collection="messages">
# examples/mail/browser/session.py
async def one_login_for_two_tabs() -> tuple[int, int, str]:
    service = MailLoginService()
    login = BrowserLogin(
        service=service,
        cookies=("mail_session",),
        expired=(SessionExpiredError,),
    )
    session = login.session(
        MailCredentials("ada@mail.example", "correct", "123456"),
        identity="ada",
    )

    async with playwright_mail() as runtime:
        first = runtime.session_client(session)
        second = await runtime.new_tab(session)
        try:
            await asyncio.gather(
                MailboxApi(first).inbox(options=OPTIONS),
                MailboxApi(second).inbox(options=OPTIONS),
            )
            state = await session.state(first)
        finally:
            await first.aclose()
            await second.aclose()

    cookie = next(item.value for item in state.cookies if item.name == "mail_session")
    return service.calls, 2, cookie

Начальное состояние

Действие runtime

Первый HTTP-вызов

Валидная session

Использовать Bearer-поле

Защищённая операция

Просроченная session

Вызвать refresh(...)

Refresh-операция

Только credentials

Вызвать acquire(...)

Login-операция

Ни сессии, ни credentials

Остановить планирование

HTTP-вызова нет

Для сохранения между запусками передайте совместимый SessionStore и стабильный identity в настройку схемы. Новая revision записывается только после успешного login или refresh.

Запускаемый файл целиком
"""Reuse an existing session without login or refresh."""

import asyncio

from examples.docs.auth_lifecycle import AuthSite, mail_sdk, saved_session


# region docs: auth-session-run
# examples/docs/auth_session.py
async def main() -> None:
    site = AuthSite()
    async with mail_sdk(site, session=saved_session()) as sdk:
        account = await sdk.account.get_account()

    print(f"account: {account.id} {account.email}")
    print(f"requests: {len(site.calls)}")
# endregion docs: auth-session-run


if __name__ == "__main__":
    asyncio.run(main())
account: user-42 ada@mail.example
requests: 1

Дальше#