http.cookiejar — HTTPクライアントのCookie処理—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/http.cookiejar
移動先:案内検索

http.cookiejar —HTTPクライアントのCookie処理

ソースコード: :source: `Lib / http / cookiejar.py`



http.cookiejar モジュールは、HTTPCookieを自動処理するためのクラスを定義します。 cookies などの小さなデータをWebサーバーからのHTTP応答によってクライアントマシンに設定し、その後のHTTP要求でサーバーに返す必要があるWebサイトにアクセスする場合に便利です。

通常のNetscapeCookieプロトコルと RFC 2965 で定義されたプロトコルの両方が処理されます。 RFC 2965の処理は、デフォルトでオフになっています。 RFC 2109 CookieはNetscapeCookieとして解析され、その後、有効な「ポリシー」に従ってNetscapeまたはRFC2965Cookieとして扱われます。 インターネット上のCookieの大部分はNetscapeCookieであることに注意してください。 http.cookiejar は、max-ageおよび [に注意することを含め、事実上のNetscape Cookieプロトコル(元のNetscape仕様で設定されたものとは大幅に異なります)に従おうとします。 X216X] Cookie-RFC2965で導入された属性。

ノート

Set-Cookie および Set-Cookie2 ヘッダーにあるさまざまな名前付きパラメーター(例: domainおよびexpires)は、従来、属性と呼ばれていました。 これらをPython属性と区別するために、このモジュールのドキュメントでは、代わりに cookie-attribute という用語を使用しています。


モジュールは次の例外を定義します:

exception http.cookiejar.LoadError

FileCookieJar のインスタンスは、ファイルからCookieをロードできない場合に、この例外を発生させます。 LoadError は、 OSError のサブクラスです。

バージョン3.3で変更: LoadErrorが IOError ではなく OSError のサブクラスになりました。

次のクラスが提供されています。

class http.cookiejar.CookieJar(policy=None)

policy は、 CookiePolicy インターフェースを実装するオブジェクトです。

CookieJar クラスはHTTPCookieを格納します。 HTTPリクエストからCookieを抽出し、HTTPレスポンスで返します。 CookieJar インスタンスは、必要に応じて、含まれているCookieを自動的に期限切れにします。 サブクラスは、ファイルまたはデータベースからのCookieの保存と取得も担当します。

class http.cookiejar.FileCookieJar(filename, delayload=None, policy=None)

policy は、 CookiePolicy インターフェースを実装するオブジェクトです。 その他の引数については、対応する属性のドキュメントを参照してください。

CookieJar は、ディスク上のファイルからCookieをロードし、場合によってはCookieを保存することができます。 load()または revert()メソッドが呼び出されるまで、Cookieは指定されたファイルから NOT ロードされます。 このクラスのサブクラスは、セクション FileCookieJarサブクラスおよびWebブラウザーとの連携に記載されています。

バージョン3.8で変更: filenameパラメーターはパスのようなオブジェクトをサポートします。

class http.cookiejar.CookiePolicy
このクラスは、各Cookieをサーバーから受け入れるかサーバーに返すかを決定する役割を果たします。
class http.cookiejar.DefaultCookiePolicy(blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=DefaultCookiePolicy.DomainLiberal, strict_ns_set_initial_dollar=False, strict_ns_set_path=False, secure_protocols=('https', 'wss'))

コンストラクター引数は、キーワード引数としてのみ渡す必要があります。 blocked_domains は、Cookieを受け入れたり、Cookieを返したりすることのない一連のドメイン名です。 allowed_domains None でない場合、これは、Cookieを受け入れて返す唯一のドメインのシーケンスです。 secure_protocols は、セキュアCookieを追加できる一連のプロトコルです。 デフォルトでは、 https および wss (安全なWebSocket)は安全なプロトコルと見なされます。 他のすべての引数については、 CookiePolicy および DefaultCookiePolicy オブジェクトのドキュメントを参照してください。

DefaultCookiePolicy は、Netscapeおよび RFC 2965 Cookieの標準の承認/拒否ルールを実装します。 デフォルトでは、 RFC 2109 Cookie(つまり、 バージョンcookie-attributeが1)の Set-Cookie ヘッダーで受信されたcookieは、RFC2965ルールに従って処理されます。 ただし、RFC 2965の処理がオフになっている場合、または rfc2109_as_netscapeTrueの場合、RFC 2109 Cookieは、 CookieJar インスタンスによってNetscapeCookieに「ダウングレード」されます。 Cookie インスタンスのX195X] 属性を0に設定します。 DefaultCookiePolicy は、ポリシーの微調整を可能にするいくつかのパラメーターも提供します。

class http.cookiejar.Cookie
このクラスは、Netscape、 RFC 2109 および RFC 2965 Cookieを表します。 http.cookiejar のユーザーが独自の Cookie インスタンスを作成することは想定されていません。 代わりに、必要に応じて、 CookieJar インスタンスでmake_cookies()を呼び出します。

も参照してください

モジュール urllib.request
自動Cookie処理によるURLオープニング。
モジュール http.cookies
HTTP cookieクラス。主に、サーバー側のコードに役立ちます。 http.cookiejar モジュールと http.cookies モジュールは相互に依存していません。
https://curl.haxx.se/rfc/cookie_spec.html
オリジナルのNetscapeCookieプロトコルの仕様。 これは依然として主要なプロトコルですが、すべての主要なブラウザ(および http.cookiejar )によって実装された「Netscapecookieプロトコル」は、cookie_spec.htmlでスケッチされたものと非常に似ています。
RFC 2109 -HTTP状態管理メカニズム
RFC 2965 によって廃止されました。 version = 1で Set-Cookie を使用します。
RFC 2965 -HTTP状態管理メカニズム
バグが修正されたNetscapeプロトコル。 Set-Cookie の代わりに Set-Cookie2 を使用します。 広く使用されていません。
http://kristol.org/cookie/errata.html
RFC 2965 への未完成のエラッタ。

RFC 2964 -HTTP状態管理の使用


CookieJarおよびFileCookieJarオブジェクト

CookieJar オブジェクトは、含まれている Cookie オブジェクトを反復処理するための iterator プロトコルをサポートします。

CookieJar には次のメソッドがあります。

CookieJar.add_cookie_header(request)

正しい Cookie ヘッダーを request に追加します。

ポリシーで許可されている場合(つまり、 CookieJarCookiePolicy インスタンスのrfc2965属性とhide_cookie2属性はそれぞれtrueとfalse)、 Cookie2 ヘッダー必要に応じて追加されます。

request オブジェクト(通常は urllib.request.Request インスタンス)は、メソッドget_full_url()get_host()get_type()unverifiable()has_header()get_header()header_items()add_unredirected_header()、およびorigin_req_host属性( urllibに記載)。リクエスト

バージョン3.3で変更: request オブジェクトにはorigin_req_host属性が必要です。 非推奨のメソッドget_origin_req_host()への依存関係は削除されました。

CookieJar.extract_cookies(response, request)

HTTP response からCookieを抽出し、ポリシーで許可されている場合は CookieJar に保存します。

CookieJar は、 response 引数で許可される Set-Cookie および Set-Cookie2 ヘッダーを探し、必要に応じてCookieを保存します(件名 CookiePolicy.set_ok()メソッドの承認に)。

response オブジェクト(通常は urllib.request.urlopen()などの呼び出しの結果)は、を返すinfo()メソッドをサポートする必要があります。 ] email.message.Message インスタンス。

request オブジェクト(通常は urllib.request.Request インスタンス)は、メソッドget_full_url()get_host()unverifiable()urllib.request に記載されているように、origin_req_host属性。 このリクエストは、Cookie属性のデフォルト値を設定するため、およびCookieの設定が許可されていることを確認するために使用されます。

バージョン3.3で変更: request オブジェクトにはorigin_req_host属性が必要です。 非推奨のメソッドget_origin_req_host()への依存関係は削除されました。

CookieJar.set_policy(policy)
使用する CookiePolicy インスタンスを設定します。
CookieJar.make_cookies(response, request)

response オブジェクトから抽出された Cookie オブジェクトのシーケンスを返します。

response および request 引数に必要なインターフェースについては、 extract_cookies()のドキュメントを参照してください。

CookieJar.set_cookie_if_ok(cookie, request)
ポリシーで問題がないと表示されている場合は、 Cookie を設定します。
CookieJar.set_cookie(cookie)
Cookie を設定します。ポリシーを確認せずに、設定する必要があるかどうかを確認します。
CookieJar.clear([domain[, path[, name]]])

いくつかのクッキーをクリアします。

引数なしで呼び出された場合は、すべてのCookieをクリアします。 引数を1つ指定すると、そのドメインに属するCookieのみが削除されます。 2つの引数を指定すると、指定したドメインとURL パスに属するCookieが削除されます。 3つの引数を指定すると、ドメインパス、および名前が指定されたCookieが削除されます。

一致するCookieが存在しない場合、 KeyError を発生させます。

CookieJar.clear_session_cookies()

すべてのセッションCookieを破棄します。

真のdiscard属性を持つすべての含まれているCookieを破棄します(通常、max-ageまたはexpires cookie属性がないか、明示的なdiscard cookieがないためです-属性)。 インタラクティブブラウザの場合、セッションの終了は通常、ブラウザウィンドウを閉じることに対応します。

save()メソッドは、真の ignore_discard 引数を渡して別の方法で要求しない限り、セッションCookieを保存しないことに注意してください。

FileCookieJar は、次の追加メソッドを実装します。

FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)

Cookieをファイルに保存します。

この基本クラスは NotImplementedError を発生させます。 サブクラスは、このメソッドを実装しないままにする場合があります。

filename は、Cookieを保存するファイルの名前です。 filename が指定されていない場合は、self.filenameが使用されます(デフォルトはコンストラクターに渡される値です)。 self.filenameNone の場合、 ValueError が発生します。

ignore_discard :破棄されるように設定されたCookieも保存します。 ignore_expires :期限切れのCookieも保存します

ファイルがすでに存在する場合は上書きされるため、ファイルに含まれるすべてのCookieが消去されます。 保存されたCookieは、 load()または revert()メソッドを使用して後で復元できます。

FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)

ファイルからCookieをロードします。

古いCookieは、新しくロードされたCookieによって上書きされない限り保持されます。

引数は save()と同じです。

名前付きファイルは、クラスが理解できる形式である必要があります。そうでない場合、 LoadError が発生します。 また、ファイルが存在しない場合など、 OSError が発生する場合があります。

バージョン3.3で変更: IOError が発生していましたが、 OSError のエイリアスになりました。

FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)

保存したファイルからすべてのCookieをクリアし、Cookieを再読み込みします。

revert()は、 load()と同じ例外を発生させる可能性があります。 障害が発生した場合、オブジェクトの状態は変更されません。

FileCookieJar インスタンスには、次のパブリック属性があります。

FileCookieJar.filename
Cookieを保持するデフォルトファイルのファイル名。 この属性はに割り当てることができます。
FileCookieJar.delayload
trueの場合、ディスクからCookieを遅延ロードします。 この属性はに割り当てないでください。 これはパフォーマンスにのみ影響し、動作には影響しないため(ディスク上のCookieが変更されていない限り)、これはヒントにすぎません。 CookieJar オブジェクトはそれを無視する場合があります。 標準ライブラリに含まれている FileCookieJar クラスはどれもCookieを遅延ロードしません。


FileCookieJarサブクラスとWebブラウザとの連携

次の CookieJar サブクラスは、読み取りと書き込み用に提供されています。

class http.cookiejar.MozillaCookieJar(filename, delayload=None, policy=None)

FileCookieJar は、Mozilla cookies.txtファイル形式(LynxおよびNetscapeブラウザーでも使用されます)でCookieをディスクにロードおよび保存できます。

ノート

これにより、 RFC 2965 Cookieに関する情報、およびportなどの新しいまたは非標準のCookie属性に関する情報が失われます。

警告

紛失/破損が不便なCookieがある場合は、保存する前にCookieをバックアップしてください(ロード/保存のラウンドトリップでファイルにわずかな変更が生じる可能性のある微妙な点がいくつかあります)。

また、Mozillaの実行中に保存されたCookieは、Mozillaによって破壊されることに注意してください。

class http.cookiejar.LWPCookieJar(filename, delayload=None, policy=None)

libwww-perlライブラリのSet-Cookie3ファイル形式と互換性のある形式でCookieをディスクにロードおよび保存できる FileCookieJar 。 これは、人間が読めるファイルにCookieを保存する場合に便利です。

バージョン3.8で変更: filenameパラメーターはパスのようなオブジェクトをサポートします。


CookiePolicyオブジェクト

CookiePolicy インターフェースを実装するオブジェクトには、次のメソッドがあります。

CookiePolicy.set_ok(cookie, request)

サーバーからCookieを受け入れるかどうかを示すブール値を返します。

cookieCookie インスタンスです。 request は、 CookieJar.extract_cookies()のドキュメントで定義されているインターフェースを実装するオブジェクトです。

CookiePolicy.return_ok(cookie, request)

Cookieをサーバーに返す必要があるかどうかを示すブール値を返します。

cookieCookie インスタンスです。 request は、 CookieJar.add_cookie_header()のドキュメントで定義されているインターフェースを実装するオブジェクトです。

CookiePolicy.domain_return_ok(domain, request)

Cookieドメインを指定して、Cookieを返送しない場合は、Falseを返します。

この方法は最適化です。 これにより、特定のドメインを持つすべてのCookieをチェックする必要がなくなります(多くのファイルの読み取りが必要になる場合があります)。 domain_return_ok()および path_return_ok()からtrueを返すと、すべての作業が return_ok()に委ねられます。

domain_return_ok()がCookieドメインに対してtrueを返す場合、 path_return_ok()がCookieパスに対して呼び出されます。 それ以外の場合、 path_return_ok()および return_ok()がそのCookieドメインに対して呼び出されることはありません。 path_return_ok()がtrueを返す場合、 return_ok()は、完全なチェックのために Cookie オブジェクト自体で呼び出されます。 それ以外の場合、 return_ok()がそのCookieパスに対して呼び出されることはありません。

domain_return_ok()は、 request ドメインだけでなく、すべての cookie ドメインに対して呼び出されることに注意してください。 たとえば、リクエストドメインが"www.example.com"の場合、関数は".example.com""www.example.com"の両方で呼び出される可能性があります。 path_return_ok()についても同じことが言えます。

request 引数は、 return_ok()に記載されているとおりです。

CookiePolicy.path_return_ok(path, request)

Cookieのパスを指定して、Cookieを返さない場合は、Falseを返します。

domain_return_ok()のドキュメントを参照してください。

上記のメソッドの実装に加えて、 CookiePolicy インターフェースの実装では、使用するプロトコルとその方法を示す次の属性も提供する必要があります。 これらの属性はすべてに割り当てることができます。

CookiePolicy.netscape
Netscapeプロトコルを実装します。
CookiePolicy.rfc2965
RFC 2965 プロトコルを実装します。
CookiePolicy.hide_cookie2
Cookie2 ヘッダーをリクエストに追加しないでください(このヘッダーの存在は、 RFC 2965 Cookieを理解していることをサーバーに示します)。

CookiePolicy クラスを定義する最も便利な方法は、 DefaultCookiePolicy からサブクラス化し、上記のメソッドの一部またはすべてをオーバーライドすることです。 CookiePolicy 自体を「nullポリシー」として使用して、すべてのCookieの設定と受信を許可することができます(これが役立つ可能性は低いです)。


DefaultCookiePolicyオブジェクト

Cookieを受け入れて返すための標準ルールを実装します。

RFC 2965 とNetscapeCookieの両方がカバーされています。 RFC 2965の処理は、デフォルトでオフになっています。

独自のポリシーを提供する最も簡単な方法は、このクラスをオーバーライドし、オーバーライドされた実装でそのメソッドを呼び出してから、独自のチェックを追加することです。

import http.cookiejar
class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):
    def set_ok(self, cookie, request):
        if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):
            return False
        if i_dont_want_to_store_this_cookie(cookie):
            return False
        return True

CookiePolicy インターフェースの実装に必要な機能に加えて、このクラスを使用すると、ドメインによるCookieの設定と受信をブロックおよび許可できます。 かなり緩いNetscapeプロトコルルールを少し厳しくすることを可能にするいくつかの厳密スイッチもあります(いくつかの良性のCookieをブロックするという犠牲を払って)。

ドメインのブラックリストとホワイトリストが提供されます(デフォルトでは両方ともオフになっています)。 ブラックリストに含まれておらず、ホワイトリストに存在するドメイン(ホワイトリストがアクティブな場合)のみがCookieの設定と返却に参加します。 blocked_domains コンストラクター引数、blocked_domains()およびset_blocked_domains()メソッド(および allowed_domains の対応する引数とメソッド)を使用します。 ホワイトリストを設定した場合は、なしに設定することで再度オフにすることができます。

ドットで始まらないブロックまたは許可リスト内のドメインは、一致するCookieドメインと同じである必要があります。 たとえば、"example.com""example.com"のブラックリストエントリと一致しますが、"www.example.com"は一致しません。 ドットで始まるドメインは、より具体的なドメインとも一致します。 たとえば、"www.example.com""www.coyote.example.com"の両方が".example.com"と一致します(ただし、"example.com"自体は一致しません)。 IPアドレスは例外であり、完全に一致する必要があります。 たとえば、blocked_domainsに"192.168.1.2"".168.1.2"が含まれている場合、192.168.1.2はブロックされますが、193.168.1.2はブロックされません。

DefaultCookiePolicy は、次の追加メソッドを実装します。

DefaultCookiePolicy.blocked_domains()
ブロックされたドメインのシーケンスを(タプルとして)返します。
DefaultCookiePolicy.set_blocked_domains(blocked_domains)
ブロックされたドメインのシーケンスを設定します。
DefaultCookiePolicy.is_blocked(domain)
ドメインがCookieを設定または受信するためのブラックリストに含まれているかどうかを返します。
DefaultCookiePolicy.allowed_domains()
None 、または許可されたドメインのシーケンス(タプルとして)を返します。
DefaultCookiePolicy.set_allowed_domains(allowed_domains)
許可されるドメインの順序、またはなしを設定します。
DefaultCookiePolicy.is_not_allowed(domain)
ドメインがCookieを設定または受信するためのホワイトリストに含まれていないかどうかを返します。

DefaultCookiePolicy インスタンスには次の属性があります。これらはすべて同じ名前のコンストラクター引数から初期化され、すべてに割り当てることができます。

DefaultCookiePolicy.rfc2109_as_netscape
trueの場合、 CookieJar インスタンスが RFC 2109 Cookieをダウングレードするように要求します(つまり、 Cookie インスタンスのバージョン属性を0に設定することにより、バージョンcookie属性が1)の Set-Cookie ヘッダーで受信したCookieをNetscapeCookieに設定します。 デフォルト値は None です。この場合、RFC 2109 Cookieは、 RFC 2965 処理がオフになっている場合にのみダウングレードされます。 したがって、RFC2109Cookieはデフォルトでダウングレードされます。

一般的な厳密性スイッチ:

DefaultCookiePolicy.strict_domain
サイトが.co.uk.gov.uk.co.nzなどの国コードトップレベルドメインで2コンポーネントドメインを設定することを許可しないでください。 これは完璧にはほど遠いため、動作が保証されていません。

RFC 2965 プロトコル厳密性スイッチ:

DefaultCookiePolicy.strict_rfc2965_unverifiable
検証不可能なトランザクションに関する RFC 2965 ルールに従います(通常、検証不可能なトランザクションは、リダイレクトまたは別のサイトでホストされているイメージの要求から生じるトランザクションです)。 これがfalseの場合、検証可能性に基づいてCookieがブロックされることはありません

Netscapeプロトコルの厳密性スイッチ:

DefaultCookiePolicy.strict_ns_unverifiable
Netscape Cookieに対しても、検証不可能なトランザクションに RFC 2965 ルールを適用します。
DefaultCookiePolicy.strict_ns_domain
NetscapeCookieのドメインマッチングルールをどの程度厳しくするかを示すフラグ。 許容値については、以下を参照してください。
DefaultCookiePolicy.strict_ns_set_initial_dollar
'$'で始まる名前のSet-Cookie:ヘッダーのCookieを無視します。
DefaultCookiePolicy.strict_ns_set_path
パスがリクエストURIとパス一致しないCookieの設定を許可しないでください。

strict_ns_domainはフラグのコレクションです。 その値は、or-を一緒に使用して作成されます(たとえば、DomainStrictNoDots|DomainStrictNonDomainは、両方のフラグが設定されていることを意味します)。

DefaultCookiePolicy.DomainStrictNoDots
Cookieを設定する場合、「ホストプレフィックス」にドットを含めることはできません(例: www.foo.bar.com.bar.comのCookieを設定できません。
DefaultCookiePolicy.DomainStrictNonDomain
domain cookie-attributeを明示的に指定しなかったCookieは、Cookieを設定したドメインと同じドメインにのみ返されます(例: spam.example.comは、domain cookie属性を持たないexample.comからcookieを返しません。
DefaultCookiePolicy.DomainRFC2965Match
Cookieを設定するときは、 RFC 2965 ドメインの完全一致が必要です。

以下の属性は便宜上提供されており、上記のフラグの最も有用な組み合わせです。

DefaultCookiePolicy.DomainLiberal
0に相当します(つまり、 上記のNetscapeドメインの厳密性フラグはすべてオフになっています)。
DefaultCookiePolicy.DomainStrict
DomainStrictNoDots|DomainStrictNonDomainと同等です。


最初の例は、 http.cookiejar の最も一般的な使用法を示しています。

import http.cookiejar, urllib.request
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

この例は、Netscape、Mozilla、またはLynx Cookieを使用してURLを開く方法を示しています(Cookieファイルの場所についてはUnix / Netscapeの規則を前提としています)。

import os, http.cookiejar, urllib.request
cj = http.cookiejar.MozillaCookieJar()
cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

次の例は、 DefaultCookiePolicy の使用法を示しています。 RFC 2965 Cookieをオンにし、Netscape Cookieを設定および返すときにドメインをより厳密にし、一部のドメインがCookieを設定したり返されたりしないようにブロックします。

import urllib.request
from http.cookiejar import CookieJar, DefaultCookiePolicy
policy = DefaultCookiePolicy(
    rfc2965=True, strict_ns_domain=Policy.DomainStrict,
    blocked_domains=["ads.net", ".ads.net"])
cj = CookieJar(policy)
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")