python standard library http.cookies

python 标准库 http.cookies

最近需要教孩子自然拼读,所以我想还是每天用一个关键词描述吧。

traffic .n UK /træf.ɪk/ US /ˈtræf.ɪk/ 交通(拥堵)

There was heavy/a lot of traffic on the roads this morning.今天早晨道路上车流量很大。

We got stuck in traffic for several hours.我们碰上交通阻塞被堵了好几个小时。

New measures have been introduced to try and ease traffic congestion in the city.这个城市已经采取了新措施,试图缓解交通拥堵。

Five people were injured in a traffic accident (= one involving vehicles).有5人在交通事故中受伤。

US I heard about the accident on the traffic report on the radio this morning.我在今早电台的交通节目中听到了这起事故。

Air traffic has increased 30 percent in the last decade.在过去的10年里,空中交通量增加了30%。

python 标准库学习 http.cookies

http.cookies 模块定义了类实现了http状态管理机制和cookies概念。不仅支持字符串格式化的cookie值,还支持任何序列化对象的cookie值。

模块的实现完全遵循 RFC 2109RFC 2068 协议规范。但MSIE 3.0x不遵循那些规范中概述的字符规则,并且当涉及Cookie处理时,许多当今的浏览器和服务器已经放宽了解析规则。

Cookie名定义字符集中非法字符囊括在 string.ascii_letters,string.digits!#$%&'*+-.^_|~:`中。

核心类

  • exception http.cookies.CookieError

    违反RFC 2109 规范中的错误,例如:不正确的属性或不正确的Set-Cookies header

  • class http.cookies.BaseCookie([*input*])

    这个类是一个字典类型的对象,键是字符串,值是 Morsel 的实例。

    如果设置参数input,实际上是通过load() 方法设置。

  • class http.cookies.SimpleCookie([*input*])

    这个类是从BaseCookie 继承过来并重写了 value_decode() and value_encode()方法。

    SimpleCookies支持字符串格式的cookie values.

Cookie对象

  • BaseCookie.value_decode(val)

    以字符串形式返回 一个元组(real_value,coded_value)。其中real_value可以是任意类型。此方法在[BaseCookie](https://docs.python.org/zh-cn/3.8/library/http.cookies.html#http.cookies.BaseCookie)中不进行解码,---因为已经存在被重写了。

  • BaseCookie.value_encode(val)

    以字符串形式返回 一个元组(real_value,coded_value)。其中val可以是任意类型,coded_value 通常被转换为字符串类型。

  • BaseCookie.output(*attrs=None*, *header='Set-Cookie:'*, *sep='\r\n'*)

    返回一个字符串表示的 用来适配 Http请求头,属性的相关方法。分隔符默认使用\r\n(CRLF)。

  • BaseCookie.js_output(*attrs=None*)

    返回一个绑定Javascript脚本的对象,如果运行的浏览器支持Javascript脚本,作为输出和 out_put()的实现一样。

  • BaseCookie.load(rawdata)`

    如果参数rawdata 是字符串,转化为 HTTP_COOKIE对象,并添加值。

    如果参数是字典类型,可以这样取值。

    1
    2
    for k, v in rawdata.items():     
    cookie[k] = v

Morsel 对象

class http.cookies.Morsel

部分实现了 RFC 2109 规范的键值对抽象类。

Morsels是一个字典类型的对象, 里面的键是一个常量,同RFC 2109 规范,如下面所示:

  • expires
  • path
  • comment
  • domain
  • max-age
  • secure
  • version
  • httponly
  • samesite

httponly 属性声明了cookie只能通过HTTP 请求传输,并且包括Javascript脚本。这将会被合并到跨站脚本部分。

samesite 声明了浏览器是否允许发送跨站请求的cookie。这将会避免CSRF 攻击。无效的值包括 “Strict” and “Lax”。

这些键是大小写敏感的.默认值是''.

  • Morsel.value

    Cookie的值。

  • Morsel.coded_value
    编码后的cookie值。

  • Morsel.key

    cookie的名字

  • Morsel.set(key, value, coded_value)

    设置key ,valuecoded_value* attributes 属性。

  • Morsel.isReservedKey(*K*)

    判断 键 知否是 Morsel 里的键的成员。

  • Morsel.output(*attrs=None*, *header='Set-Cookie:'*)

    返回字符串格式的 Morsel 。默认包括所有的属性,除非指定声明attrs 属性,header 参数默认值是"Set-Cookie:".

  • Morsel.js_output(*attrs=None*)

    返回一个绑定Javascript脚本的对象,如果运行的浏览器支持Javascript脚本,作为输出和 out_put()的实现一样。

  • Morsel.OutputString(*attrs=None*)

    返回一个字符串格式的 Morsel,不包括Http或Javascript。

  • Morsel.update(*values*)

    根据参数值更新Morsel 字典。如果参数不在字典中则引发异常。具体可以参考 RFC 2109

  • Morsel.copy(*value*)

    返回一个 Morsel 对象的浅拷贝。

  • Morsel.setdefault(*key*, *value=None*)

    Raise an error if key is not a valid RFC 2109 attribute, otherwise behave the same as dict.setdefault().

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
>>> 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

小结

顺便了解了下http协议的相关内容,附链接。

RFC 2068 :http超文本传输协议1.0

RFC 2616 :http超文本传输协议1.1

RFC 2109: http状态管理机制

坚持原创技术分享,您的支持将鼓励我继续创作!