数据结构

Werkzeug提供了一些常见的python对象的子类,用附加的特性来扩展它们。其中一些用于使它们不可变,另一些用于更改某些语义以更好地使用HTTP。

一般用途

Changelog

在 0.6 版本发生变更: 现在,只要包含的对象是可酸洗的,通用类就可以在每个协议中进行酸洗。这意味着 FileMultiDict 一旦它包含一个文件,就不会被pickle。

class werkzeug.datastructures.TypeConversionDict

就像一个普通的口述,但是 get() 方法无法执行类型转换。 MultiDictCombinedMultiDict 是此类的子类并提供相同的功能。

Changelog

在 0.5 版本加入.

get(key, default=None, type=None)

如果请求的数据不存在,则返回默认值。如果 type 是可调用的,它应转换值、返回值或引发 ValueError 如果不可能的话。在这种情况下,函数将返回默认值,就像找不到值一样:

>>> d = TypeConversionDict(foo='42', bar='blub')
>>> d.get('foo', type=int)
42
>>> d.get('bar', -1, type=int)
-1
参数:
  • key -- 要查找的密钥。

  • default -- 无法查找键时返回的默认值。如果没有进一步规定 None 返回。

  • type -- 用于在 MultiDict . 如果A ValueError 由该可调用项引发,将返回默认值。

class werkzeug.datastructures.ImmutableTypeConversionDict

像一个 TypeConversionDict 但不支持修改。

Changelog

在 0.5 版本加入.

copy()

返回此对象的浅可变副本。请记住,标准库的 copy() 函数是此类的no op,与任何其他Python不可变类型(例如: tuple

class werkzeug.datastructures.MultiDict(mapping=None)

A MultiDict 是一个字典子类,它是为处理同一个键的多个值而定制的,例如由包装器中的解析函数使用。这是必需的,因为某些HTML表单元素为同一个键传递多个值。

MultiDict 实现所有标准字典方法。在内部,它将键的所有值保存为一个列表,但是标准的dict访问方法将只返回键的第一个值。如果您还想访问其他值,则必须使用 list 方法如下所述。

基本用途:

>>> d = MultiDict([('a', 'b'), ('a', 'c')])
>>> d
MultiDict([('a', 'b'), ('a', 'c')])
>>> d['a']
'b'
>>> d.getlist('a')
['b', 'c']
>>> 'a' in d
True

它的行为类似于普通的dict,因此当找到一个键的多个值时,所有dict函数都只返回第一个值。

从Werkzeug 0.3起, KeyError 由此类引发的也是 BadRequest HTTP异常,并将呈现 400 BAD REQUEST 如果在一个catch all中捕获HTTP异常。

A MultiDict 可由以下项构成 (key, value) Tuples,一个dict,一个 MultiDict 或者从werkzeug 0.2开始一些关键字参数。

参数:

mapping -- 的初始值 MultiDict .或者是普通的口述,或者是 (key, value) 元组或 None .

add(key, value)

为键添加新值。

Changelog

在 0.6 版本加入.

参数:
  • key -- 值的键。

  • value -- 要添加的值。

clear() None.  Remove all items from D.
copy()

返回此对象的浅副本。

deepcopy(memo=None)

返回此对象的深度副本。

fromkeys(value=None, /)

使用iterable中的键和设置为value的值创建新字典。

get(key, default=None, type=None)

如果请求的数据不存在,则返回默认值。如果 type 是可调用的,它应转换值、返回值或引发 ValueError 如果不可能的话。在这种情况下,函数将返回默认值,就像找不到值一样:

>>> d = TypeConversionDict(foo='42', bar='blub')
>>> d.get('foo', type=int)
42
>>> d.get('bar', -1, type=int)
-1
参数:
  • key -- 要查找的密钥。

  • default -- 无法查找键时返回的默认值。如果没有进一步规定 None 返回。

  • type -- 用于在 MultiDict . 如果A ValueError 由该可调用项引发,将返回默认值。

getlist(key, type=None)

返回给定键的项目列表。如果该密钥不在 MultiDict ,则返回值将为空列表。就像 getgetlist 接受一个 type 参数。所有项目都将使用在那里定义的可调用项进行转换。

参数:
  • key -- 要查找的密钥。

  • type -- 用于在 MultiDict . 如果A ValueError 由该可调用项引发,该值将从列表中删除。

返回:

list 键的所有值。

items(multi=False)

返回的迭代器 (key, value) 对。

参数:

multi -- 如果设置为 True 返回的迭代器对于每个键的每个值都有一对。否则,它将只包含每个键的第一个值的对。

keys() a set-like object providing a view on D's keys
lists()

返回的迭代器 (key, values) pairs,其中values是与键关联的所有值的列表。

listvalues()

返回与键关联的所有值的迭代器。压缩 keys() 这和打电话一样 lists()

>>> d = MultiDict({"foo": [1, 2, 3]})
>>> zip(d.keys(), d.listvalues()) == d.lists()
True
pop(key, default=no value)

在dict上弹出列表的第一项。然后从dict中删除键,因此将丢弃其他值:

>>> d = MultiDict({"foo": [1, 2, 3]})
>>> d.pop("foo")
1
>>> "foo" in d
False
参数:
  • key -- 弹出的键。

  • default -- 如果提供了要在密钥不在字典中时返回的值。

popitem()

从听写中弹出一个项目。

popitemlist()

流行音乐 (key, list) 口述中的元组。

poplist(key)

从dict中弹出键列表。如果键不在dict中,则返回空列表。

Changelog

在 0.5 版本发生变更: 如果该键不再存在,将返回一个列表,而不是引发错误。

setdefault(key, default=None)

如果键在dict中,则返回该键的值,否则返回 default 并将该值设置为 key .

参数:
  • key -- 要查找的密钥。

  • default -- 如果密钥不在dict中,则返回默认值。如果未进一步指定,则返回 None .

setlist(key, new_list)

删除键的旧值并添加新值。请注意,传递值的列表在插入字典之前将被浅复制。

>>> d = MultiDict()
>>> d.setlist('foo', ['1', '2'])
>>> d['foo']
'1'
>>> d.getlist('foo')
['1', '2']
参数:
  • key -- 为其设置值的键。

  • new_list -- 具有键的新值的iterable。先删除旧值。

setlistdefault(key, default_list=None)

喜欢 setdefault 但设置多个值。返回的列表不是副本,而是实际在内部使用的列表。这意味着您可以通过将项附加到列表中,将新值放入dict中:

>>> d = MultiDict({"foo": 1})
>>> d.setlistdefault("foo").extend([2, 3])
>>> d.getlist("foo")
[1, 2, 3]
参数:
  • key -- 要查找的密钥。

  • default_list -- 默认值的可重复项。它要么被复制(如果它是一个列表),要么在返回之前被转换成一个列表。

返回:

list

to_dict(flat=True)

将内容作为常规dict.if返回 flatTrue 如果 flatFalse 所有值都将作为列表返回。

参数:

flat -- 如果设置为 False 返回的dict将包含包含所有值的列表。否则,它将只包含每个键的第一个值。

返回:

dict

update(mapping)

update()扩展而不是替换现有的键列表:

>>> a = MultiDict({'x': 1})
>>> b = MultiDict({'x': 2, 'y': 3})
>>> a.update(b)
>>> a
MultiDict([('y', 3), ('x', 1), ('x', 2)])

如果键的值列表 other_dict 为空,不会向dict添加新值,也不会创建键:

>>> x = {'empty_list': []}
>>> y = MultiDict()
>>> y.update(x)
>>> y
MultiDict([])
values()

返回每个键值列表中第一个值的迭代器。

class werkzeug.datastructures.OrderedMultiDict(mapping=None)

像普通人一样工作 MultiDict 但保持了田地的秩序。要将有序的多听写转换为列表,可以使用 items() 方法并通过 multi=True .

一般来说 OrderedMultiDict 是一个数量级慢于 MultiDict .

笔记

由于python的限制,不能使用 dict(multidict) .相反,你必须使用 to_dict() 方法,否则将暴露内部bucket对象。

class werkzeug.datastructures.ImmutableMultiDict(mapping=None)

不变的 MultiDict .

Changelog

在 0.5 版本加入.

copy()

返回此对象的浅可变副本。请记住,标准库的 copy() 函数是此类的no op,与任何其他Python不可变类型(例如: tuple

class werkzeug.datastructures.ImmutableOrderedMultiDict(mapping=None)

不变的 OrderedMultiDict .

Changelog

在 0.6 版本加入.

copy()

返回此对象的浅可变副本。请记住,标准库的 copy() 函数是此类的no op,与任何其他Python不可变类型(例如: tuple

class werkzeug.datastructures.CombinedMultiDict(dicts=None)

A只读 MultiDict 你可以通过多次 MultiDict 实例作为序列,它将组合所有包装的dict的返回值:

>>> from werkzeug.datastructures import CombinedMultiDict, MultiDict
>>> post = MultiDict([('foo', 'bar')])
>>> get = MultiDict([('blub', 'blah')])
>>> combined = CombinedMultiDict([get, post])
>>> combined['foo']
'bar'
>>> combined['blub']
'blah'

这适用于所有读取操作,并将引发 TypeError 对于通常更改不可能的数据的方法。

从Werkzeug 0.3起, KeyError 由此类引发的也是 BadRequest HTTP异常,并将呈现 400 BAD REQUEST 如果在一个catch all中捕获HTTP异常。

class werkzeug.datastructures.ImmutableDict

不变的 dict .

Changelog

在 0.5 版本加入.

copy()

返回此对象的浅可变副本。请记住,标准库的 copy() 函数是此类的no op,与任何其他Python不可变类型(例如: tuple

class werkzeug.datastructures.ImmutableList(iterable=(), /)

不变的 list .

Changelog

在 0.5 版本加入.

私有的:

class werkzeug.datastructures.FileMultiDict(mapping=None)

一个特别的 MultiDict 它有向其中添加文件的方便方法。这是用来 EnvironBuilder 通常用于单元测试。

Changelog

在 0.5 版本加入.

add_file(name, file, filename=None, content_type=None)

将新文件添加到dict。 file 可以是文件名或 file -就像或是 FileStorage 对象。

参数:
  • name -- the name of the field.

  • file -- 文件名或 file -像物体

  • filename -- 可选文件名

  • content_type -- 可选内容类型

其他

class werkzeug.datastructures.FileStorage(stream=None, filename=None, name=None, content_type=None, content_length=None, headers=None)

这个 FileStorage 类是对传入文件的精简包装。请求对象使用它来表示上载的文件。包装流的所有属性都由文件存储代理,因此可以这样做 storage.read() 而不是长形 storage.stream.read() .

stream

上载文件的输入流。这通常指向一个打开的临时文件。

filename

客户端上的文件的文件名。可以是一个 str ,或者是 os.PathLike

name

表单域的名称。

headers

多部分标题为 Headers 对象。这通常包含不相关的信息,但结合自定义多部分请求,原始头可能会很有趣。

Changelog

在 0.6 版本加入.

close()

如果可能,关闭基础文件。

property content_length

在标题中发送的内容长度。通常不可用

property content_type

在头中发送的内容类型。通常不可用

property mimetype

喜欢 content_type ,但不带参数(例如,不带字符集、类型等)且始终为小写。例如,如果内容类型为 text/HTML; charset=utf-8 mimetype应该是 'text/html' .

Changelog

在 0.7 版本加入.

property mimetype_params

mimetype参数为dict。例如,如果内容类型为 text/html; charset=utf-8 参数是 {{'charset': 'utf-8'}} .

Changelog

在 0.7 版本加入.

save(dst, buffer_size=16384)

将文件保存到目标路径或文件对象。如果目标是一个文件对象,那么在调用后必须自己关闭它。缓冲区大小是复制过程中内存中保留的字节数。默认为16KB。

对于安全文件保存,也可以查看 secure_filename() .

参数:
Changelog

在 1.0 版本发生变更: 支架 pathlib .