21.23. http.cookies
— HTTPの状態管理¶
ソースコード: Lib/http/cookies.py
http.cookies
モジュールはHTTPの状態管理機能であるcookieの概念を抽象化、定義しているクラスです。単純な文字列のみで構成されるcookieのほか、シリアル化可能なあらゆるデータ型でクッキーの値を保持するための機能も備えています。
このモジュールは元々 RFC 2109 と RFC 2068 に定義されている構文解析の規則を厳密に守っていました。しかし、MSIE 3.0x がこれらの RFC で定義された文字の規則に従っていないことが判明し、また、現代の多くのブラウザとサーバも Cookie の処理に緩い解析をしており、結局、やや厳密さを欠く構文解析規則にせざるを得ませんでした。
文字集合 string.ascii_letters
、 string.digits
、 !#$%&'*+-.^_`|~:
を、このモジュールは Cookie 名 (key
) として有効と認めています。
バージョン 3.3 で変更: ‘:’ が有効な Cookie 名の文字として認められました。
注釈
不正な cookie に遭遇した場合、 CookieError
例外を送出します。そのため、ブラウザから持ってきた cookie データをパースするときには常に不正なデータに備え CookieError
例外を捕捉してください。
属性や Set-Cookie ヘッダが正しくないなど、 RFC 2109 に合致していないときに発生する例外です。
このクラスはキーが文字列、値が
Morsel
インスタンスで構成される辞書風オブジェクトです。値に対するキーを設定するときは、値がキーと値を含むMorsel
に変換されることに注意してください。input が与えられたときは、そのまま
load()
メソッドへ渡されます。
このクラスは
BaseCookie
の派生クラスで、value_decode()
は与えられた値の正当性を確認するように、value_encode()
はstr()
で文字列化するようにそれぞれオーバライドします。
参考
- モジュール
http.cookiejar
Web クライアント 向けの HTTP クッキー処理です。
http.cookiejar
とhttp.cookies
は互いに独立しています。- RFC 2109 - HTTP State Management Mechanism
このモジュールが実装しているHTTPの状態管理に関する規格です。
21.23.1. Cookieオブジェクト¶
文字列表現を値にデコードして返します。戻り値の型はどのようなものでも許されます。このメソッドは
BaseCookie
において何も実行せず、オーバーライドされるためにだけ存在します。
エンコードした値を返します。元の値はどのような型でもかまいませんが、戻り値は必ず文字列となります。このメソッドは
BaseCookie
において何も実行せず、オーバーライドされるためにだけ存在します。通常
value_encode()
とvalue_decode()
はともに value_decode の処理内容から逆算した範囲に収まっていなければなりません。
HTTPヘッダ形式の文字列表現を返します。 attrs と header はそれぞれ
Morsel
のoutput()
メソッドに送られます。 sep はヘッダの連結に用いられる文字で、デフォルトは'\r\n'
(CRLF)となっています。
ブラウザがJavaScriptをサポートしている場合、HTTPヘッダを送信した場合と同様に動作する埋め込み可能なJavaScript snippetを返します。
attrs の意味は
output()
と同じです。
rawdata が文字列であれば、
HTTP_COOKIE
として処理し、その値をMorsel
として追加します。辞書の場合は次と同様の処理をおこないます:for k, v in rawdata.items(): cookie[k] = v
21.23.2. Morselオブジェクト¶
RFC 2109 の属性をキーと値で保持するabstractクラスです。
Morselは辞書風のオブジェクトで、キーは次のような RFC 2109 準拠の定数となっています
expires
path
comment
domain
max-age
secure
version
httponly
httponly
属性は、 cookie が HTTP リクエストでのみ送信されて、 JavaScript からのはアクセスできない事を示します。これはいくつかのクロスサイトスクリプティングの脅威を和らげることを意図しています。キーの大小文字は区別されません。そのデフォルト値は
''
です。
クッキーの値。
バージョン 3.5 で撤廃:
value
の割り当てには代わりにset()
を使用してください。
実際に送信する形式にエンコードされたcookieの値。
バージョン 3.5 で撤廃:
coded_value
の割り当てには代わりにset()
を使用してください。
cookieの名前。
バージョン 3.5 で撤廃:
key
の割り当てには代わりにset()
を使用してください。
属性 key、value、coded_value に値をセットします。
バージョン 3.5 で撤廃: ドキュメント化されていない LegalChars 引数は無視され、将来のバージョンでは削除されます。
K が
Morsel
のキーであるかどうかを判定します。
MoselをHTTPヘッダ形式の文字列表現にして返します。attrs を指定しない場合、デフォルトですべての属性を含めます。attrs を指定する場合、属性をリストで渡さなければなりません。header のデフォルトは
"Set-Cookie:"
です。
Return an embeddable JavaScript snippet, which, if run on a browser which supports JavaScript, will act the same as if the HTTP header was sent.
attrs の意味は
output()
と同じです。
Moselの文字列表現をHTTPやJavaScriptで囲まずに出力します。
attrs の意味は
output()
と同じです。
Morsel 辞書の値を辞書 values の値で更新します。values 辞書のキーのいずれかが有効な RFC 2109 属性でない場合エラーを送出します。
バージョン 3.5 で変更: 不正なキーではエラーが送出されます。
Morsel オブジェクトの浅いコピーを返します。
バージョン 3.5 で変更: 辞書ではなく Morsel オブジェクトを返します。
キーが有効な RFC 2109 属性でない場合エラーを送出します。そうでない場合は
dict.setdefault()
と同じように振る舞います。
21.23.3. 例¶
次の例は http.cookies
の使い方を示したものです。
>>> from http import cookies
>>> C = cookies.SimpleCookie()
>>> C["fig"] = "newton"
>>> C["sugar"] = "wafer"
>>> print(C) # generate HTTP headers
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> print(C.output()) # same thing
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> C = cookies.SimpleCookie()
>>> C["rocky"] = "road"
>>> C["rocky"]["path"] = "/cookie"
>>> print(C.output(header="Cookie:"))
Cookie: rocky=road; Path=/cookie
>>> print(C.output(attrs=[], header="Cookie:"))
Cookie: rocky=road
>>> C = cookies.SimpleCookie()
>>> C.load("chips=ahoy; vienna=finger") # load from a string (HTTP header)
>>> print(C)
Set-Cookie: chips=ahoy
Set-Cookie: vienna=finger
>>> C = cookies.SimpleCookie()
>>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";')
>>> print(C)
Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;"
>>> C = cookies.SimpleCookie()
>>> C["oreo"] = "doublestuff"
>>> C["oreo"]["path"] = "/"
>>> print(C)
Set-Cookie: oreo=doublestuff; Path=/
>>> C = cookies.SimpleCookie()
>>> C["twix"] = "none for you"
>>> C["twix"].value
'none for you'
>>> C = cookies.SimpleCookie()
>>> C["number"] = 7 # equivalent to C["number"] = str(7)
>>> C["string"] = "seven"
>>> C["number"].value
'7'
>>> C["string"].value
'seven'
>>> print(C)
Set-Cookie: number=7
Set-Cookie: string=seven