はじめに
今回はPythonのRequestsモジュールでCookieを扱う方法を備忘録として残していこうと思います。
背景は、FlaskなどでAPI開発を行なっている時に、Cookie情報を扱うことがありそもそも、結合テストなどで楽にCookie情報を扱う方法をまとめておこうと思った次第です。
Requestsライブラリ
インストール
PyPIで管理されているライブラリのため、Python仮想環境や各環境下でPipを使ったインストールで使えます。
$ pip install requests
RequestsライブラリでCookieを扱う
Cookieとは
CookieとはWebサービスなどにアクセスした際に、アクセスされたWebサーバがアクセス元のクライアントコンピュータ(Webブラウザ)に送信する小さなファイルのことです。
CookieはChromeなどのWebブラウザに保存され、保存された情報は各サーバオリジンごとにブラウザで管理されています。
ブラウザ上でオリジンごとに保存されたCookieは任意の破棄時間を持ち、破棄時間まではそのオリジンに対するリクエストと共にサーバに送られます。
Cookieの用途
Cookieは主に下記の3つの用途に用いられます。
- セッション管理
- 個人設定
- ユーザートラッキング
HTTP通信内のCookie
WebサーバからクライアントへのCookieセット
こちらのサイトによるとCookieがセットされる指示が組み込まれたHTTPレスポンスの中身は下記のようになります。
HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
レスポンスヘッダー内に”Set-Cookie: <cookie-name>=<cookie-value>“の形式で情報が組み込まれています。
クライアントからWebサーバへのCookie送信
一方でブラウザ上で保存しているCookie情報は下記のようにHTTPリクエスト内に組み込まれます。
GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
こちらもリクエストヘッダー内に”Cookie: <cookie-name>=<cookie-value>“の形式で組み込まれています。
オリジンとは
スキームや、オリジンとはホスト名などのドメイン、Webサーバのポート番号などから構成される情報で、イメージとしてはブラウザのURLに表示されたり、入力される情報に近いです。
しかし、オリジンは上記のスキーム、ホストおよびポート番号により同一オリジンか、異なるオリジンかが分かれるため、厳密にはURL≠オリジンです。
例)https://hogehoge.comの場合
スキーム:https
ホスト: hogehoge.com
ポート:443番だがスキームがhttpsのため省略
同一オリジン例:https://hogehoge.com/getHoge
異なるオリジン例:https://hogehoge.com:5000
レスポンスでブラウザにクッキーをセットする処理を加える
それでは本題のPython RequestライブラリにおけるCookieの取り扱いについて説明します。
まずはWebサーバからのHTTPレスポンスにおけるCookieセット処理についてです。
今回は例としてFlaskのAPIを例に取り、/sessionときたらsession_keyをクライアントに返す処理を組みます。
Flaskの書き方は割愛します。
from flask import Flask, make_response, request
def create_app():
app = Flask(__name__)
return app
app = create_app()
@app.route("/session")
def create_session_key():
<Session Key作成処理は省略>
session_key = 'AAAAAAA'
response = make_response()
response.set_cookie('session_key', session_key)
return response, 200
レスポンス処理にCookie情報をブラウザ側でセットさせる命令を組み込むのはmake_response()モジュールのset_cookie()メソッドになります。
直接下記のようにHTTPレスポンスHeaderに組み込むことも可能です。
response.headers['Set-Cookie'] = 'session_key=AAAAAAA'
リクエストにクッキー情報を載せる
requestsライブラリにcookie情報を載せたいことってありますよね。
例えばWebスクレイピングや開発テストの時。
クライアントからrequestsライブラリを使ってWebサイトから情報を取得する際に、HTTPリクエストにCookie情報を載せないと取得できない情報がある場合や、Webアプリケーションを開発しているときにテストを実施するにあたり、擬似Cookie情報を載せたHTTPリクエストを送らないといけない場合があります。
そんな場合はrequestsライブラリを下記のように扱うと簡単にHTTPリクエストにCookie情報を擬似的に載せてて扱うことができます。
import requests
cookies = {"session_key": "AAAAAAAAAA"}
url = 'https://sample.coms'
res = requests.get(url=url, cookies=cookies)
res_json = res.json()
requestsのgetやpostモジュールにはcookiesという引数が用意されており、cookies引数にDict型でkey, valueを渡すことにより、任意のCookie情報をHTTPリクエストに載せて送ることができます。
厳密には内部的にヘッダー情報としてセットしてくれています。
また、参考程度ですが先ほど述べたように、Cookie情報はあくまでHTTPリクエストのヘッダー情報の一部ですので、cookies引数を使わずともheaders引数に直接ヘッダー情報として定義してから送ることもできます。
import requests
res = requests.get(
url=<URL>,
headers={'Cookie': 'session_key=AAAAAA'}
)
res_json = res.json()
まとめ
いかがだったでしょうか。
今回はPythonのrequestsモジュールでCookieを扱う方法を記録として残しています。
今回の要点になります。
・Cookieはオリジンごとにブラウザで管理される
・CookieはHTTPのヘッダー情報の一部
・Pythonのrequestsライブラリではmake_responseモジュールのset_cookieでHTTPレスポンスにSet-Cookie処理を追加できる
・Pyrhonのrequestsライブラリではrequest.get()やrequests.post()などのHTTPリクエスト作成のメソッド内でcookies引数にセットすることでCookieを明示的にリクエストに載せることができる