http.cookies — HTTP state management¶
Source code:Lib/http/cookies.py
Thehttp.cookies module defines classes for abstracting the concept ofcookies, an HTTP state management mechanism. It supports both simple string-onlycookies, and provides an abstraction for having any serializable data-type ascookie value.
The module formerly strictly applied the parsing rules described in theRFC 2109 andRFC 2068 specifications. It has since been discovered thatMSIE 3.0x didn’t follow the character rules outlined in those specs; manycurrent-day browsers and servers have also relaxed parsing rules when it comesto cookie handling. As a result, this module now uses parsing rules that are abit less strict than they once were.
The character set,string.ascii_letters,string.digits and!#$%&'*+-.^_`|~: denote the set of valid characters allowed by this modulein a cookie name (askey).
Changed in version 3.3:Allowed ‘:’ as a valid cookie name character.
Note
On encountering an invalid cookie,CookieError is raised, so if yourcookie data comes from a browser you should always prepare for invalid dataand catchCookieError on parsing.
- exceptionhttp.cookies.CookieError¶
Exception failing because ofRFC 2109 invalidity: incorrect attributes,incorrectSet-Cookie header, etc.
- classhttp.cookies.BaseCookie([input])¶
This class is a dictionary-like object whose keys are strings and whose valuesare
Morselinstances. Note that upon setting a key to a value, thevalue is first converted to aMorselcontaining the key and the value.Ifinput is given, it is passed to the
load()method.
- classhttp.cookies.SimpleCookie([input])¶
This class derives from
BaseCookieand overridesvalue_decode()andvalue_encode().SimpleCookiesupportsstrings as cookie values. When setting the value,SimpleCookiecalls the builtinstr()to convertthe value to a string. Values received from HTTP are kept as strings.
See also
- Module
http.cookiejar HTTP cookie handling for webclients. The
http.cookiejarandhttp.cookiesmodules do not depend on each other.- RFC 2109 - HTTP State Management Mechanism
This is the state management specification implemented by this module.
Cookie Objects¶
- BaseCookie.value_decode(val)¶
Return a tuple
(real_value,coded_value)from a string representation.real_valuecan be any type. This method does no decoding inBaseCookie— it exists so it can be overridden.
- BaseCookie.value_encode(val)¶
Return a tuple
(real_value,coded_value).val can be any type, butcoded_valuewill always be converted to a string.This method does no encoding inBaseCookie— it exists so it canbe overridden.In general, it should be the case that
value_encode()andvalue_decode()are inverses on the range ofvalue_decode.
- BaseCookie.output(attrs=None,header='Set-Cookie:',sep='\r\n')¶
Return a string representation suitable to be sent as HTTP headers.attrs andheader are sent to each
Morsel’soutput()method.sep is usedto join the headers together, and is by default the combination'\r\n'(CRLF).
Morsel Objects¶
- classhttp.cookies.Morsel¶
Abstract a key/value pair, which has someRFC 2109 attributes.
Morsels are dictionary-like objects, whose set of keys is constant — the validRFC 2109 attributes, which are:
The attribute
httponlyspecifies that the cookie is only transferredin HTTP requests, and is not accessible through JavaScript. This is intendedto mitigate some forms of cross-site scripting.The attribute
samesitecontrols when the browser sends the cookie withcross-site requests. This helps to mitigate CSRF attacks. Valid values are“Strict” (only sent with same-site requests), “Lax” (sent with same-siterequests and top-level navigations), and “None” (sent with same-site andcross-site requests). When using “None”, the “secure” attribute must alsobe set, as required by modern browsers.The attribute
partitionedindicates to user agents that thesecross-site cookiesshould only be available in the same top-level contextthat the cookie was first set in. For this to be accepted by the user agent,youmust also setSecure.In addition, it is recommended to use the
__Hostprefix when settingpartitioned cookies to make them bound to the hostname and not theregistrable domain. ReadCHIPS (Cookies Having Independent Partitioned State)for full details and examples.The keys are case-insensitive and their default value is
''.Changed in version 3.7:Attributes
key,valueandcoded_valueare read-only. Useset()forsetting them.Changed in version 3.8:Added support for the
samesiteattribute.Changed in version 3.14:Added support for the
partitionedattribute.
- Morsel.value¶
The value of the cookie.
- Morsel.coded_value¶
The encoded value of the cookie — this is what should be sent.
- Morsel.key¶
The name of the cookie.
- Morsel.set(key,value,coded_value)¶
Set thekey,value andcoded_value attributes.
- Morsel.output(attrs=None,header='Set-Cookie:')¶
Return a string representation of the Morsel, suitable to be sent as an HTTPheader. By default, all the attributes are included, unlessattrs is given, inwhich case it should be a list of attributes to use.header is by default
"Set-Cookie:".
- Morsel.js_output(attrs=None)¶
Return an embeddable JavaScript snippet, which, if run on a browser whichsupports JavaScript, will act the same as if the HTTP header was sent.
The meaning forattrs is the same as in
output().
- Morsel.OutputString(attrs=None)¶
Return a string representing the Morsel, without any surrounding HTTP orJavaScript.
The meaning forattrs is the same as in
output().
- Morsel.update(values)¶
Update the values in the Morsel dictionary with the values in the dictionaryvalues. Raise an error if any of the keys in thevalues dict is not avalidRFC 2109 attribute.
Changed in version 3.5:an error is raised for invalid keys.
- Morsel.copy(value)¶
Return a shallow copy of the Morsel object.
Changed in version 3.5:return a Morsel object instead of a dict.
- Morsel.setdefault(key,value=None)¶
Raise an error if key is not a validRFC 2109 attribute, otherwisebehave the same as
dict.setdefault().
Example¶
The following example demonstrates how to use thehttp.cookies module.
>>>fromhttpimportcookies>>>C=cookies.SimpleCookie()>>>C["fig"]="newton">>>C["sugar"]="wafer">>>print(C)# generate HTTP headersSet-Cookie: fig=newtonSet-Cookie: sugar=wafer>>>print(C.output())# same thingSet-Cookie: fig=newtonSet-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=ahoySet-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=7Set-Cookie: string=seven