Python | Web / API:セッション管理

Python Python
スポンサーリンク

概要(セッション管理は「同じ条件を保ったまま、速く安定して通信する」ための基礎)

Pythonのrequestsでセッション管理をすると、接続の再利用(Keep-Alive)、クッキーやヘッダーの持続、認証の引き継ぎ、リトライ設定の使い回しができます。ポイントは「Sessionを1つ作ってまとめて使う」「タイムアウトとエラー処理を必ず入れる」「クッキーと認証をSessionに載せる」「使い終わったら閉じる」の4点です。これだけで、単発のrequests.get/requests.postより速く・壊れにくいコードになります。


基本の使い方(ここが重要)

Sessionの作成とクローズ(最短パターン)

# pip install requests
import requests

with requests.Session() as s:                   # コンテキスト管理で自動close
    s.headers.update({"User-Agent": "MyClient/1.0"})
    r = s.get("https://httpbin.org/get", timeout=5)
    r.raise_for_status()
    print(r.json())
Python

「with」を使えばクローズ忘れがありません。共通ヘッダーを一度だけ設定して、以降の通信に自動で適用できます。

クッキーとヘッダーの持続(ログイン後の連続アクセス)

import requests

with requests.Session() as s:
    s.headers.update({"Accept": "application/json"})
    # ログイン(例:フォーム認証)
    login = s.post("https://httpbin.org/post", data={"user": "taro", "pass": "secret"}, timeout=5)
    login.raise_for_status()

    # 以後のリクエストはクッキーやヘッダーを引き継ぐ
    r = s.get("https://httpbin.org/cookies", timeout=5)
    r.raise_for_status()
    print(r.json())
Python

Sessionはサーバから渡されたクッキーを保持します。ログイン後の連続アクセスが簡単になります。


実務で効く深掘り(接続再利用・認証・リトライ)

接続の再利用(高速化の核)

import requests

with requests.Session() as s:
    for path in ["/get", "/uuid", "/ip"]:
        r = s.get(f"https://httpbin.org{path}", timeout=5)
        r.raise_for_status()
        print(r.status_code)
Python

同じホストへ複数回アクセスするならSessionで接続を再利用し、TLSハンドシェイクの無駄を減らせます。大量リクエストで体感速度が変わります。

認証トークン・ベーシック認証の保持

import requests

with requests.Session() as s:
    s.headers.update({"Authorization": "Bearer YOUR_TOKEN"})
    # 以降のAPI呼び出しにトークンが自動付与される
    r = s.get("https://httpbin.org/bearer", timeout=5)
    print(r.status_code)

    # ベーシック認証例
    r2 = s.get("https://httpbin.org/basic-auth/user/pass", auth=("user", "pass"), timeout=5)
    print(r2.status_code)
Python

共通認証ヘッダーはSessionに載せておくのが定石。ベーシック認証はauth=で都度渡しても、同じSessionならクッキーなどが引き継がれて便利です。

リトライ設定をSessionへ取り付ける(短いバックオフ)

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retry)

with requests.Session() as s:
    s.mount("https://", adapter)
    r = s.get("https://httpbin.org/status/503", timeout=5)
    print("最終ステータス:", r.status_code)
Python

5xxなど一時不調に対して、自動で指数バックオフ付き再試行が可能。GETのような冪等操作に限定して使うのが安全です。


クッキー・セッションIDの扱い(ログイン維持の型)

クッキーの読み書き(確認・手動設定)

import requests

with requests.Session() as s:
    s.get("https://httpbin.org/cookies/set?session=abc", timeout=5)
    r = s.get("https://httpbin.org/cookies", timeout=5)
    print("保持クッキー:", r.json())

    # 手動でクッキー追加
    s.cookies.set("tenant", "koto-city")
    r2 = s.get("https://httpbin.org/cookies", timeout=5)
    print("手動追加後:", r2.json())
Python

サーバセットのクッキーを自動保持しつつ、必要なら手動で追加もできます。セッションIDやテナント情報の確認に役立ちます。

セッションを跨ぐ保存(必要ならCookieJarを外部保存)

ログイン状態をファイルに保存して再利用したい場合、CookieJarを自前で保存・読み込み(pickleやbrowsercookieの利用など)します。ただしセキュリティリスクがあるため、機密情報は暗号化や短寿命トークンの採用が望ましいです。


プロキシ・証明書・セキュリティ(環境に合わせた設定)

プロキシ経由・証明書検証

import requests

with requests.Session() as s:
    s.proxies.update({"https": "http://proxy.example:8080"})
    r = s.get("https://httpbin.org/get", timeout=5)
    print(r.status_code)

    # 証明書検証(基本はTrueのまま)
    r2 = s.get("https://httpbin.org/get", verify=True, timeout=5)
Python

社内ネットワークではプロキシ設定が必要なことがあります。verify=Falseは原則避け、正しい証明書を信頼ストアに登録して対応します。


エラー処理・タイムアウト・設計の勘所(壊さないための型)

例外の基本線(毎回timeout、raise_for_status)

import requests

with requests.Session() as s:
    try:
        r = s.get("https://httpbin.org/delay/3", timeout=1.5)
        r.raise_for_status()
    except requests.Timeout:
        print("タイムアウト")
    except requests.ConnectionError:
        print("接続エラー")
    except requests.HTTPError as e:
        print("HTTPエラー:", e)
Python

「timeoutを常に付け、raise_for_statusで失敗を例外化」が基本。成功前提で進めると壊れます。

スコープ設計(Sessionの生存期間)

  • 短命タスク: with Session() as s のブロックで完結させる。
  • 長命アプリ: 起動時にSessionを作ってDI(依存性注入)し、使い回す。使い終わったら明示的にclose。
  • 並列処理: 同一Sessionの共有は避け、スレッド/プロセスごとにSessionを持つ。

上書き・競合対策(ヘッダー/クッキー)

共通ヘッダーをupdateで載せつつ、個別リクエストではheaders=で上書き可能。クッキーはAPI境界ごとに分けるか、セッションを分離して衝突を避けます。


例題で身につける(定番から実務まで)

例題1:共通ヘッダー+複数GET(高速・安定)

import requests

with requests.Session() as s:
    s.headers.update({"User-Agent": "MyClient/1.0", "Accept": "application/json"})
    for path in ["/get", "/uuid", "/ip"]:
        r = s.get(f"https://httpbin.org{path}", timeout=5)
        r.raise_for_status()
        print(r.status_code)
Python

例題2:ログインフォーム→保護ページ取得(クッキー維持)

import requests

with requests.Session() as s:
    login = s.post("https://httpbin.org/post", data={"username": "taro", "password": "secret"}, timeout=5)
    login.raise_for_status()
    r = s.get("https://httpbin.org/cookies", timeout=5)
    print(r.json())
Python

例題3:Sessionにリトライを装着(5xxのみ再試行)

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retry)

with requests.Session() as s:
    s.mount("https://", adapter)
    r = s.get("https://httpbin.org/status/503", timeout=5)
    print("最終:", r.status_code)
Python

例題4:プロキシ+認証トークンを一括管理

import requests

with requests.Session() as s:
    s.proxies.update({"https": "http://proxy.example:8080"})
    s.headers.update({"Authorization": "Bearer TOKEN", "Accept": "application/json"})
    r = s.get("https://httpbin.org/bearer", timeout=5)
    print(r.status_code)
Python

まとめ

セッション管理は、同じ条件を保ちながら高速・安定に通信するための基礎です。Sessionで接続・クッキー・ヘッダー・認証をまとめ、timeoutとraise_for_statusで壊れない型にする。必要ならリトライを装着し、プロキシや証明書に対応。生存期間の設計(短命はwith、長命は共有とclose)、並列処理での分離、上書きルールの整理まで押さえれば、初心者でも実務品質のWeb/API連携を短いコードで安定運用できます。

タイトルとURLをコピーしました