Повторно использовать сессию#
Передайте 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-вызов |
|---|---|---|
Валидная |
Использовать Bearer-поле |
Защищённая операция |
Просроченная |
Вызвать |
Refresh-операция |
Только |
Вызвать |
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