Upgrading Werkzeug 2 to 3
Breaking2.3.8 → 3.1.9Breaking8Security10Platform1Deprecated1New5Changed10Fixed39Other2
SecurityFixes `safe_join` on Windows to disallow special device names with empty ADS markers on NTFS.GHSA-g6x2-hccm-hh4m · CVE-2026-102598 ↗
BreakingUpgrade verdict
7 breaking changes and a platform requirement change and 10 security fixes.
In plain terms
- Code that was already marked deprecated in earlier versions has been deleted, so anything still using it will break.
- Forms with large non-file fields are now rejected by default at 500kB, where before there was no limit.
- Cache-Control header values are now consistently strings or None, and invalid typed values read back as None instead of raw strings.
- A max-age directive with no value now reads as None instead of -1.
Must act Top 5 of 19 that need code or config changes
Python requirement changed in 3.1.0: >=3.8 → >=3.9.
What you must change
Breaking7
Removes previously deprecated code.
Request.max_form_memory_size now defaults to 500kB instead of unlimited; larger non-file form fields raise RequestEntityTooLarge.
Request.max_form_memory_sizeRequestEntityTooLargeCache control dict values are always str or None; setting properties converts to string and False becomes None; typed getters return None on ValueError.
request.cache_controlresponse.cache_controlcache_control max_age is None when present without a value, rather than -1.
max_agecache_control no_cache is a boolean True for requests instead of "*", but remains a string for responses.
no_cachecache_control private is True when present without a value, rather than "*".
privatemax_stalecache_control min_fresh is None when present without a value, rather than "*".
min_freshSecurity10
Fixes
safe_join on Windows to disallow special device names with empty ADS markers on NTFS.safe_joinAuthorization parsing basic auth disallows non-base64 characters.AuthorizationFixes
safe_join on Windows to reject special device names in multi-segment paths.safe_joinMedium · CVSS 5.3safe_join on Windows now blocks more special device names, regardless of extension or surrounding spaces.
safe_joinMedium · CVSS 5.3safe_join on Windows now rejects special device names, preventing reads via send_from_directory.
safe_joinsend_from_directorysecure_filenameIncreases the default PBKDF2 work factor to 1,000,000 iterations.
PBKDF2Fixes how max_form_memory_size is applied when parsing large non-file fields.
max_form_memory_sizeHigh · CVSS 7.5safe_join now catches certain Windows paths that ntpath.isabs missed on Python < 3.11.
safe_joinntpath.isabsRestricts dev server debugger requests to localhost, .localhost, 127.0.0.1, or the specified hostname; debugger UI now uses full URLs.
localhost.localhost127.0.0.1High · CVSS 7.5Werkzeug is a comprehensive WSGI web application library. If an upload of a file that starts with CR or LF and then is followed by megabytes of data without these characters: all of these bytes are appended chunk by chunk into internal bytearray and lookup for boundary is performed on growing buffer. This allows an attacker to cause a denial of service by sending crafted multipart data to an endpoint that will parse it. The amount of CPU time required can block worker processes from handling legitimate requests. This vulnerability has been patched in version 3.0.1.
High · CVSS 7.5Platform1
Drops support for Python 3.8.
Deprecations to plan for
Deprecated1
Deprecates OrderedMultiDict and ImmutableOrderedMultiDict in favor of MultiDict and ImmutableMultiDict.
OrderedMultiDictImmutableOrderedMultiDictMultiDictImmutableMultiDictAPI changes
Generated by DepDelta from published Python source. Not mixed with prose notes.
- removed:
export ImmutableOrderedMultiDict - removed:
export OrderedMultiDict
- removed:
field Accept.provided: bool - removed:
property Accept.best -> str - changed:
class Accept(ImmutableList[tuple[str, int]]) → class Accept(ImmutableList[tuple[str, float]]) - changed:
constructor Accept(values: Accept | Iterable[tuple[str, float]] | None=…) -> None → constructor Accept(values: Accept | cabc.Iterable[tuple[str, float]] | None=…) -> None - changed:
method Accept.best_match(matches: Iterable[str], default: str) -> str | (matches: Iterable[str], default: str | None=…) -> str | None → method Accept.best_match(matches: cabc.Iterable[str]) -> str | None | (matches: cabc.Iterable[str], default: str=…) -> str - changed:
method Accept.find(key: str) -> int → method Accept.find(key: str | tuple[str, float]) -> int - changed:
method Accept.index(key: str) -> int → method Accept.index(key: str | tuple[str, float]) -> int - changed:
method Accept.quality(key: str) -> int → method Accept.quality(key: str) -> float - changed:
method Accept.values() -> Iterator[str] → method Accept.values() -> cabc.Iterator[str] - added:
method LanguageAccept.best_match(matches: cabc.Iterable[str]) -> str | None | (matches: cabc.Iterable[str], default: str=…) -> str - added:
property Accept.best -> str | None
- removed:
field WWWAuthenticate.auth_property - removed:
function auth_property(name: str, doc: str | None=…) -> property - removed:
method WWWAuthenticate.set_basic(realm: str=…) -> None - removed:
method WWWAuthenticate.set_digest(realm: str, nonce: str, qop: t.Sequence[str]=…, opaque: str | None=…, algorithm: str | None=…, stale: bool=…) -> None - removed:
property WWWAuthenticate.parameters -> dict[str, str] - removed:
property WWWAuthenticate.qop -> set[str] - removed:
property WWWAuthenticate.stale -> bool | None - changed:
constructor Authorization(auth_type: str, data: dict[str, str] | None=…, token: str | None=…) -> None → constructor Authorization(auth_type: str, data: dict[str, str | None] | None=…, token: str | None=…) -> None - changed:
constructor WWWAuthenticate(auth_type: str | None=…, values: dict[str, str] | None=…, token: str | None=…) → constructor WWWAuthenticate(auth_type: str, values: dict[str, str | None] | None=…, token: str | None=…) - added:
property WWWAuthenticate.parameters -> dict[str, str | None]
- removed:
property RequestCacheControl.max_stale -> int | None - removed:
property RequestCacheControl.min_fresh -> int | None - removed:
property RequestCacheControl.only_if_cached -> bool | None - removed:
property ResponseCacheControl.immutable -> bool | None - removed:
property ResponseCacheControl.must_revalidate -> bool | None - removed:
property ResponseCacheControl.private -> bool | None - removed:
property ResponseCacheControl.proxy_revalidate -> bool | None - removed:
property ResponseCacheControl.public -> bool | None - removed:
property ResponseCacheControl.s_maxage -> int | None - removed:
variable T - changed:
class RequestCacheControl(ImmutableDictMixin[str, _OptCPT], _CacheControl) → class RequestCacheControl(ImmutableDictMixin[str, t.Optional[str]], _CacheControl) - changed:
function cache_control_property(key: str, empty: _OptCPT, type: type[_CPT]) -> property → function cache_control_property(key: str, empty: t.Any, type: type[t.Any] | None, *, doc: str | None=…) -> t.Any - added:
field RequestCacheControl.max_stale: int | t.Literal[True] | None - added:
field RequestCacheControl.min_fresh: int | None - added:
field RequestCacheControl.no_cache: bool - added:
field RequestCacheControl.only_if_cached: bool - added:
field ResponseCacheControl.immutable: bool - added:
field ResponseCacheControl.must_revalidate: bool - added:
field ResponseCacheControl.must_understand: bool - added:
field ResponseCacheControl.no_cache: str | t.Literal[True] | None - added:
field ResponseCacheControl.private: str | t.Literal[True] | None - added:
field ResponseCacheControl.proxy_revalidate: bool - added:
field ResponseCacheControl.public: bool - added:
field ResponseCacheControl.s_maxage: int | None - added:
field ResponseCacheControl.stale_while_revalidate: int | None
- removed:
field ContentSecurityPolicy.provided: bool - removed:
property ContentSecurityPolicy.base_uri -> str | None - removed:
property ContentSecurityPolicy.child_src -> str | None - removed:
property ContentSecurityPolicy.connect_src -> str | None - removed:
property ContentSecurityPolicy.default_src -> str | None - removed:
property ContentSecurityPolicy.font_src -> str | None - removed:
property ContentSecurityPolicy.form_action -> str | None - removed:
property ContentSecurityPolicy.frame_ancestors -> str | None - removed:
property ContentSecurityPolicy.frame_src -> str | None - removed:
property ContentSecurityPolicy.img_src -> str | None - removed:
property ContentSecurityPolicy.manifest_src -> str | None - removed:
property ContentSecurityPolicy.media_src -> str | None - removed:
property ContentSecurityPolicy.navigate_to -> str | None - removed:
property ContentSecurityPolicy.object_src -> str | None - removed:
property ContentSecurityPolicy.plugin_types -> str | None - removed:
property ContentSecurityPolicy.prefetch_src -> str | None - removed:
property ContentSecurityPolicy.report_to -> str | None - removed:
property ContentSecurityPolicy.report_uri -> str | None - removed:
property ContentSecurityPolicy.sandbox -> str | None - removed:
property ContentSecurityPolicy.script_src -> str | None - removed:
property ContentSecurityPolicy.script_src_attr -> str | None - removed:
property ContentSecurityPolicy.script_src_elem -> str | None - removed:
property ContentSecurityPolicy.style_src -> str | None - removed:
property ContentSecurityPolicy.style_src_attr -> str | None - removed:
property ContentSecurityPolicy.style_src_elem -> str | None - removed:
property ContentSecurityPolicy.worker_src -> str | None - changed:
class ContentSecurityPolicy(UpdateDictMixin[str, str], dict[str, str]) → class ContentSecurityPolicy(CallbackDict[str, str]) - changed:
constructor ContentSecurityPolicy(values: Mapping[str, str] | Iterable[tuple[str, str]]=…, on_update: Callable[[ContentSecurityPolicy], None] | None=…) -> None → constructor ContentSecurityPolicy(values: cabc.Mapping[str, str] | cabc.Iterable[tuple[str, str]] | None=…, on_update: cabc.Callable[[ContentSecurityPolicy], None] | None=…) -> None - changed:
function csp_property(key: str) -> property → function csp_property(key: str) -> t.Any - added:
field ContentSecurityPolicy.base_uri: str | None - added:
field ContentSecurityPolicy.child_src: str | None - added:
field ContentSecurityPolicy.connect_src: str | None - added:
field ContentSecurityPolicy.default_src: str | None - added:
field ContentSecurityPolicy.font_src: str | None - added:
field ContentSecurityPolicy.form_action: str | None - added:
field ContentSecurityPolicy.frame_ancestors: str | None - added:
field ContentSecurityPolicy.frame_src: str | None - added:
field ContentSecurityPolicy.img_src: str | None - added:
field ContentSecurityPolicy.manifest_src: str | None - added:
field ContentSecurityPolicy.media_src: str | None - added:
field ContentSecurityPolicy.navigate_to: str | None - added:
field ContentSecurityPolicy.object_src: str | None - added:
field ContentSecurityPolicy.plugin_types: str | None - added:
field ContentSecurityPolicy.prefetch_src: str | None - added:
field ContentSecurityPolicy.report_to: str | None - added:
field ContentSecurityPolicy.report_uri: str | None - added:
field ContentSecurityPolicy.sandbox: str | None - added:
field ContentSecurityPolicy.script_src: str | None - added:
field ContentSecurityPolicy.script_src_attr: str | None - added:
field ContentSecurityPolicy.script_src_elem: str | None - added:
field ContentSecurityPolicy.style_src: str | None - added:
field ContentSecurityPolicy.style_src_attr: str | None - added:
field ContentSecurityPolicy.style_src_elem: str | None - added:
field ContentSecurityPolicy.worker_src: str | None
- removed:
field ETags.star_tag: bool - changed:
class ETags(Collection[str]) → class ETags(cabc.Collection[str]) - changed:
constructor ETags(strong_etags: Iterable[str] | None=…, weak_etags: Iterable[str] | None=…, star_tag: bool=…) -> None → constructor ETags(strong_etags: cabc.Iterable[str] | None=…, weak_etags: cabc.Iterable[str] | None=…, star_tag: bool=…)
- removed:
field FileStorage.filename: str | None - removed:
field FileStorage.headers: Headers - removed:
field FileStorage.name: str | None - removed:
field FileStorage.stream: IO[bytes] - removed:
property FileStorage.content_type -> str - changed:
constructor FileStorage(stream: IO[bytes] | None=…, filename: str | PathLike | None=…, name: str | None=…, content_type: str | None=…, content_length: int | None=…, headers: Headers | None=…) -> None → constructor FileStorage(stream: t.IO[bytes] | None=…, filename: str | None=…, name: str | None=…, content_type: str | None=…, content_length: int | None=…, headers: Headers | None=…) - changed:
method FileMultiDict.add_file(name: str, file: FileStorage | str | IO[bytes], filename: str | None=…, content_type: str | None=…) -> None → method FileMultiDict.add_file(name: str, file: str | os.PathLike[str] | t.IO[bytes] | FileStorage, filename: str | None=…, content_type: str | None=…) -> None - changed:
method FileStorage.save(dst: str | PathLike | IO[bytes], buffer_size: int=…) -> None → method FileStorage.save(dst: str | os.PathLike[str] | t.IO[bytes], buffer_size: int=…) -> None - added:
property FileStorage.content_type -> str | None
- removed:
field EnvironHeaders.environ: WSGIEnvironment - removed:
method Headers.has_key(key: str) -> bool - removed:
variable D - changed:
class Headers(dict[str, str]) → class Headers - changed:
constructor Headers(defaults: Mapping[str, str | Iterable[str]] | Iterable[tuple[str, str]] | None=…) -> None → constructor Headers(defaults: Headers | MultiDict[str, t.Any] | cabc.Mapping[str, t.Any | list[t.Any] | tuple[t.Any, ...] | set[t.Any]] | cabc.Iterable[tuple[str, t.Any]] | None=…) -> None - changed:
method EnvironHeaders.copy() -> NoReturn → method EnvironHeaders.copy() -> t.NoReturn - changed:
method Headers.add(_key: str, _value: str, **kw: str) -> None → method Headers.add(key: str, value: t.Any, /, **kwargs: t.Any) -> None - changed:
method Headers.add_header(_key: str, _value: str, **_kw: str) -> None → method Headers.add_header(key: str, value: t.Any, /, **kwargs: t.Any) -> None - changed:
method Headers.copy() -> Headers → method Headers.copy() -> te.Self - changed:
method Headers.extend(*args: Mapping[str, str | Iterable[str]] | Iterable[tuple[str, str]], **kwargs: str | Iterable[str]) -> None → method Headers.extend(arg: Headers | MultiDict[str, t.Any] | cabc.Mapping[str, t.Any | list[t.Any] | tuple[t.Any, ...] | set[t.Any]] | cabc.Iterable[tuple[str, t.Any]] | None=…, /, **kwargs: str) -> None - changed:
method Headers.get(key: str, default: str) -> str | (key: str, default: str | None=…) -> str | None | (key: str, default: T | None=…, type: Callable[[str], T]=…) -> T | None → method Headers.get(key: str) -> str | None | (key: str, default: str) -> str | (key: str, default: T) -> str | T | (key: str, type: cabc.Callable[[str], T]) -> T | None | (key: str, default: T, type: cabc.Callable[[str], T]) -> T - changed:
method Headers.getlist(key: str) -> list[str] | (key: str, type: Callable[[str], T]) -> list[T] → method Headers.getlist(key: str) -> list[str] | (key: str, type: cabc.Callable[[str], T]) -> list[T] - changed:
method Headers.items(lower: bool=…) -> Iterator[tuple[str, str]] → method Headers.items(lower: bool=…) -> t.Iterable[tuple[str, str]] - changed:
method Headers.keys(lower: bool=…) -> Iterator[str] → method Headers.keys(lower: bool=…) -> t.Iterable[str] - changed:
method Headers.pop(key: str, default: str | None=…) -> str | (key: int | None=…, default: tuple[str, str] | None=…) -> tuple[str, str] → method Headers.pop() -> tuple[str, str] | (key: str) -> str | (key: int | None=…) -> tuple[str, str] | (key: str, default: str) -> str | (key: str, default: T) -> str | T - changed:
method Headers.set(_key: str, _value: str, **kw: str) -> None → method Headers.set(key: str, value: t.Any, /, **kwargs: t.Any) -> None - changed:
method Headers.setdefault(key: str, default: str) -> str → method Headers.setdefault(key: str, default: t.Any) -> str - changed:
method Headers.setlist(key: str, values: Iterable[str]) -> None → method Headers.setlist(key: str, values: cabc.Iterable[t.Any]) -> None - changed:
method Headers.setlistdefault(key: str, default: Iterable[str]) -> None → method Headers.setlistdefault(key: str, default: cabc.Iterable[t.Any]) -> list[str] - changed:
method Headers.update(__m: SupportsKeysAndGetItem[str, str], **kwargs: str | Iterable[str]) -> None | (__m: Iterable[tuple[str, str]], **kwargs: str | Iterable[str]) -> None | (**kwargs: str | Iterable[str]) -> None → method Headers.update(arg: Headers | MultiDict[str, t.Any] | cabc.Mapping[str, t.Any | list[t.Any] | tuple[t.Any, ...] | cabc.Set[t.Any]] | cabc.Iterable[tuple[str, t.Any]] | None=…, /, **kwargs: t.Any | list[t.Any] | tuple[t.Any, ...] | cabc.Set[t.Any]) -> None - changed:
method Headers.values() -> Iterator[str] → method Headers.values() -> t.Iterable[str]
- removed:
function is_immutable(self: object) -> NoReturn - changed:
class ImmutableDictMixin(dict[K, V]) → class ImmutableDictMixin(t.Generic[K, V]) - changed:
class ImmutableHeadersMixin(Headers) → class ImmutableHeadersMixin - changed:
class ImmutableListMixin(list[V]) → class ImmutableListMixin - changed:
field UpdateDictMixin.on_update: Callable[[UpdateDictMixin[K, V] | None, None], None] → field UpdateDictMixin.on_update: cabc.Callable[[te.Self], None] | None - changed:
method ImmutableDictMixin.clear() -> NoReturn → method ImmutableDictMixin.clear() -> t.NoReturn - changed:
method ImmutableDictMixin.pop(key: K, default: V | None=…) -> NoReturn → method ImmutableDictMixin.pop(key: t.Any, default: t.Any=…) -> t.NoReturn - changed:
method ImmutableDictMixin.popitem() -> NoReturn → method ImmutableDictMixin.popitem() -> t.NoReturn - changed:
method ImmutableDictMixin.setdefault(key: K, default: V | None=…) -> NoReturn → method ImmutableDictMixin.setdefault(key: t.Any, default: t.Any=…) -> t.NoReturn - changed:
method ImmutableDictMixin.update(*args: Any, **kwargs: V) -> NoReturn → method ImmutableDictMixin.update(arg: t.Any, /, **kwargs: t.Any) -> t.NoReturn - changed:
method ImmutableHeadersMixin.add(_key: Any, _value: Any, **kw: Any) -> NoReturn → method ImmutableHeadersMixin.add(key: t.Any, value: t.Any, /, **kwargs: t.Any) -> t.NoReturn - changed:
method ImmutableHeadersMixin.add_header(_key: Any, _value: Any, **_kw: Any) -> NoReturn → method ImmutableHeadersMixin.add_header(key: t.Any, value: t.Any, /, **kwargs: t.Any) -> t.NoReturn - changed:
method ImmutableHeadersMixin.extend(*args: Any, **kwargs: Any) -> NoReturn → method ImmutableHeadersMixin.extend(arg: t.Any, /, **kwargs: t.Any) -> t.NoReturn - changed:
method ImmutableHeadersMixin.insert(pos: Any, value: Any) -> NoReturn → method ImmutableHeadersMixin.insert(pos: t.Any, value: t.Any) -> t.NoReturn - changed:
method ImmutableHeadersMixin.pop(key: Any=…, default: Any=…) -> NoReturn → method ImmutableHeadersMixin.pop(key: t.Any=…, default: t.Any=…) -> t.NoReturn - changed:
method ImmutableHeadersMixin.popitem() -> NoReturn → method ImmutableHeadersMixin.popitem() -> t.NoReturn - changed:
method ImmutableHeadersMixin.remove(key: Any) -> NoReturn → method ImmutableHeadersMixin.remove(key: t.Any) -> t.NoReturn - changed:
method ImmutableHeadersMixin.set(_key: Any, _value: Any, **kw: Any) -> NoReturn → method ImmutableHeadersMixin.set(key: t.Any, value: t.Any, /, **kwargs: t.Any) -> t.NoReturn - changed:
method ImmutableHeadersMixin.setdefault(key: Any, default: Any) -> NoReturn → method ImmutableHeadersMixin.setdefault(key: t.Any, default: t.Any) -> t.NoReturn - changed:
method ImmutableHeadersMixin.setlist(key: Any, values: Any) -> NoReturn → method ImmutableHeadersMixin.setlist(key: t.Any, values: t.Any) -> t.NoReturn - changed:
method ImmutableHeadersMixin.setlistdefault(key: Any, default: Any) -> NoReturn → method ImmutableHeadersMixin.setlistdefault(key: t.Any, default: t.Any) -> t.NoReturn - changed:
method ImmutableHeadersMixin.update(*args: Any, **kwargs: Any) -> NoReturn → method ImmutableHeadersMixin.update(arg: t.Any, /, **kwargs: t.Any) -> t.NoReturn - changed:
method ImmutableListMixin.append(value: V) -> NoReturn → method ImmutableListMixin.append(item: t.Any) -> t.NoReturn - changed:
method ImmutableListMixin.extend(values: Iterable[V]) -> NoReturn → method ImmutableListMixin.extend(iterable: t.Any) -> t.NoReturn - changed:
method ImmutableListMixin.insert(pos: SupportsIndex, value: V) -> NoReturn → method ImmutableListMixin.insert(pos: t.Any, value: t.Any) -> t.NoReturn - changed:
method ImmutableListMixin.pop(index: SupportsIndex=…) -> NoReturn → method ImmutableListMixin.pop(index: t.Any=…) -> t.NoReturn - changed:
method ImmutableListMixin.remove(value: V) -> NoReturn → method ImmutableListMixin.remove(item: t.Any) -> t.NoReturn - changed:
method ImmutableListMixin.reverse() -> NoReturn → method ImmutableListMixin.reverse() -> t.NoReturn - changed:
method ImmutableListMixin.sort(key: Callable[[V], Any] | None=…, reverse: bool=…) -> NoReturn → method ImmutableListMixin.sort(key: t.Any=…, reverse: t.Any=…) -> t.NoReturn - changed:
method ImmutableMultiDictMixin.add(key: K, value: V) -> NoReturn → method ImmutableMultiDictMixin.add(key: t.Any, value: t.Any) -> t.NoReturn - changed:
method ImmutableMultiDictMixin.popitemlist() -> NoReturn → method ImmutableMultiDictMixin.popitemlist() -> t.NoReturn - changed:
method ImmutableMultiDictMixin.poplist(key: K) -> NoReturn → method ImmutableMultiDictMixin.poplist(key: t.Any) -> t.NoReturn - changed:
method ImmutableMultiDictMixin.setlist(key: K, new_list: Iterable[V]) -> NoReturn → method ImmutableMultiDictMixin.setlist(key: t.Any, new_list: t.Any) -> t.NoReturn - changed:
method ImmutableMultiDictMixin.setlistdefault(key: K, default_list: Iterable[V] | None=…) -> NoReturn → method ImmutableMultiDictMixin.setlistdefault(key: t.Any, default_list: t.Any=…) -> t.NoReturn - changed:
method UpdateDictMixin.pop(key: K) -> V | (key: K, default: V | T=…) -> V | T → method UpdateDictMixin.pop(key: K) -> V | (key: K, default: V) -> V | (key: K, default: T) -> T - changed:
method UpdateDictMixin.update(__m: SupportsKeysAndGetItem[K, V], **kwargs: V) -> None | (__m: Iterable[tuple[K, V]], **kwargs: V) -> None | (**kwargs: V) -> None → method UpdateDictMixin.update(arg: cabc.Mapping[K, V] | cabc.Iterable[tuple[K, V]] | None=…, /, **kwargs: V) -> None - changed:
static method ImmutableDictMixin.fromkeys(keys: Iterable[K], value: V | None=…) -> ImmutableDictMixin[K, V] → static method ImmutableDictMixin.fromkeys(keys: cabc.Iterable[K], value: None) -> ImmutableDictMixin[K, t.Any | None] | (keys: cabc.Iterable[K], value: V) -> ImmutableDictMixin[K, V] - added:
variable F
- removed:
field ContentRange.on_update: Callable[[ContentRange], None] | None - removed:
field IfRange.date: datetime | None - removed:
field IfRange.etag: str | None - removed:
field Range.ranges: list[tuple[int, int | None]] - removed:
field Range.units: str - removed:
property ContentRange.length -> int | None - removed:
property ContentRange.start -> int | None - removed:
property ContentRange.stop -> int | None - removed:
property ContentRange.units -> str | None - changed:
constructor ContentRange(units: str | None, start: int | None, stop: int | None, length: int | None=…, on_update: Callable[[ContentRange], None] | None=…) -> None → constructor ContentRange(units: str | None, start: int | None, stop: int | None, length: int | None=…, on_update: cabc.Callable[[ContentRange], None] | None=…) -> None - changed:
constructor IfRange(etag: str | None=…, date: datetime | None=…) -> None → constructor IfRange(etag: str | None=…, date: datetime | None=…) - changed:
constructor Range(units: str, ranges: list[tuple[int, int | None]]) -> None → constructor Range(units: str, ranges: cabc.Sequence[tuple[int, int | None]]) -> None - added:
field ContentRange.length: int | None - added:
field ContentRange.start: int | None - added:
field ContentRange.stop: int | None - added:
field ContentRange.units: str | None - added:
variable T
- removed:
class ImmutableOrderedMultiDict(ImmutableMultiDictMixin[K, V], OrderedMultiDict[K, V]) - removed:
class OrderedMultiDict(MultiDict[K, V]) - removed:
constructor OrderedMultiDict(mapping: Mapping[K, V] | None=…) -> None - removed:
field CombinedMultiDict.dicts: list[MultiDict[K, V]] - removed:
field HeaderSet.on_update: Callable[[HeaderSet], None] | None - removed:
function is_immutable(self: object) -> NoReturn - removed:
method CombinedMultiDict.has_key(key: K) -> bool - removed:
method CombinedMultiDict.to_dict() -> dict[K, V] | (flat: Literal[False]) -> dict[K, list[V]] - removed:
method ImmutableOrderedMultiDict.copy() -> OrderedMultiDict[K, V] - removed:
method OrderedMultiDict.add(key: K, value: V) -> None - removed:
method OrderedMultiDict.getlist(key: K) -> list[V] | (key: K, type: Callable[[V], T]=…) -> list[T] - removed:
method OrderedMultiDict.items(multi: bool=…) -> Iterator[tuple[K, V]] - removed:
method OrderedMultiDict.keys() -> Iterator[K] - removed:
method OrderedMultiDict.lists() -> Iterator[tuple[K, list[V]]] - removed:
method OrderedMultiDict.listvalues() -> Iterator[list[V]] - removed:
method OrderedMultiDict.pop(key: K) -> V | (key: K, default: V | T=…) -> V | T - removed:
method OrderedMultiDict.popitem() -> tuple[K, V] - removed:
method OrderedMultiDict.popitemlist() -> tuple[K, list[V]] - removed:
method OrderedMultiDict.poplist(key: K) -> list[V] - removed:
method OrderedMultiDict.setlist(key: K, new_list: Iterable[V]) -> None - removed:
method OrderedMultiDict.setlistdefault(key: K, default_list: Iterable[V] | None=…) -> list[V] - removed:
method OrderedMultiDict.update(mapping: Mapping[K, V] | Iterable[tuple[K, V]]) -> None - removed:
method OrderedMultiDict.values() -> Iterator[V] - removed:
variable D - changed:
class HeaderSet(set[str]) → class HeaderSet(cabc.MutableSet[str]) - changed:
class ImmutableList(ImmutableListMixin[V]) → class ImmutableList(ImmutableListMixin, list[V]) - changed:
constructor CallbackDict(initial: Mapping[K, V] | Iterable[tuple[K, V]] | None=…, on_update: Callable[[_CD], None] | None=…) -> None → constructor CallbackDict(initial: cabc.Mapping[K, V] | cabc.Iterable[tuple[K, V]] | None=…, on_update: cabc.Callable[[te.Self], None] | None=…) -> None - changed:
constructor CombinedMultiDict(dicts: Iterable[MultiDict[K, V]] | None) -> None → constructor CombinedMultiDict(dicts: cabc.Iterable[MultiDict[K, V]] | None=…) -> None - changed:
constructor HeaderSet(headers: Iterable[str] | None=…, on_update: Callable[[HeaderSet], None] | None=…) -> None → constructor HeaderSet(headers: cabc.Iterable[str] | None=…, on_update: cabc.Callable[[te.Self], None] | None=…) -> None - changed:
constructor MultiDict(mapping: Mapping[K, Iterable[V] | V] | Iterable[tuple[K, V]] | None=…) -> None → constructor MultiDict(mapping: MultiDict[K, V] | cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] | cabc.Iterable[tuple[K, V]] | None=…) -> None - changed:
function iter_multi_items(mapping: Mapping[K, V | Iterable[V]] | Iterable[tuple[K, V]]) -> Iterator[tuple[K, V]] → function iter_multi_items(mapping: MultiDict[K, V] | cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] | cabc.Iterable[tuple[K, V]]) -> cabc.Iterator[tuple[K, V]] - changed:
method CombinedMultiDict.get(key: K) -> V | None | (key: K, default: V | T=…) -> V | T | (key: K, default: T | None=…, type: Callable[[V], T]=…) -> T | None → method CombinedMultiDict.get(key: K) -> V | None | (key: K, default: V) -> V | (key: K, default: T) -> V | T | (key: str, type: cabc.Callable[[V], T]) -> T | None | (key: str, default: T, type: cabc.Callable[[V], T]) -> T - changed:
method CombinedMultiDict.getlist(key: K) -> list[V] | (key: K, type: Callable[[V], T]=…) -> list[T] → method CombinedMultiDict.getlist(key: K) -> list[V] | (key: K, type: cabc.Callable[[V], T]) -> list[T] - changed:
method CombinedMultiDict.items(multi: bool=…) -> Iterator[tuple[K, V]] → method CombinedMultiDict.items() -> cabc.Iterable[tuple[K, V]] | (multi: t.Literal[True]) -> cabc.Iterable[tuple[K, list[V]]] - changed:
method CombinedMultiDict.keys() -> set[K] → method CombinedMultiDict.keys() -> cabc.Iterable[K] - changed:
method CombinedMultiDict.lists() -> Iterator[tuple[K, list[V]]] → method CombinedMultiDict.lists() -> cabc.Iterable[tuple[K, list[V]]] - changed:
method CombinedMultiDict.listvalues() -> Iterator[list[V]] → method CombinedMultiDict.listvalues() -> cabc.Iterable[list[V]] - changed:
method CombinedMultiDict.values() -> Iterator[V] → method CombinedMultiDict.values() -> cabc.Iterable[V] - changed:
method HeaderSet.update(iterable: Iterable[str]) -> None → method HeaderSet.update(iterable: cabc.Iterable[str]) -> None - changed:
method MultiDict.copy() -> MultiDict[K, V] → method MultiDict.copy() -> te.Self - changed:
method MultiDict.deepcopy(memo: Any=…) -> MultiDict[K, V] → method MultiDict.deepcopy(memo: t.Any=…) -> te.Self - changed:
method MultiDict.getlist(key: K) -> list[V] | (key: K, type: Callable[[V], T]=…) -> list[T] → method MultiDict.getlist(key: K) -> list[V] | (key: K, type: cabc.Callable[[V], T]) -> list[T] - changed:
method MultiDict.items(multi: bool=…) -> Iterator[tuple[K, V]] → method MultiDict.items(multi: bool=…) -> cabc.Iterable[tuple[K, V]] - changed:
method MultiDict.lists() -> Iterator[tuple[K, list[V]]] → method MultiDict.lists() -> cabc.Iterable[tuple[K, list[V]]] - changed:
method MultiDict.listvalues() -> Iterator[list[V]] → method MultiDict.listvalues() -> cabc.Iterable[list[V]] - changed:
method MultiDict.pop(key: K) -> V | (key: K, default: V | T=…) -> V | T → method MultiDict.pop(key: K) -> V | (key: K, default: V) -> V | (key: K, default: T) -> V | T - changed:
method MultiDict.setdefault(key: K, default: V | None=…) -> V → method MultiDict.setdefault(key: K) -> None | (key: K, default: V) -> V - changed:
method MultiDict.setlist(key: K, new_list: Iterable[V]) -> None → method MultiDict.setlist(key: K, new_list: cabc.Iterable[V]) -> None - changed:
method MultiDict.setlistdefault(key: K, default_list: Iterable[V] | None=…) -> list[V] → method MultiDict.setlistdefault(key: K, default_list: cabc.Iterable[V] | None=…) -> list[V] - changed:
method MultiDict.to_dict() -> dict[K, V] | (flat: Literal[False]) -> dict[K, list[V]] → method MultiDict.to_dict(flat: t.Literal[True]=…) -> dict[K, V] | (flat: t.Literal[False]) -> dict[K, list[V]] - changed:
method MultiDict.update(mapping: Mapping[K, Iterable[V] | V] | Iterable[tuple[K, V]]) -> None → method MultiDict.update(mapping: MultiDict[K, V] | cabc.Mapping[K, V | list[V] | tuple[V, ...] | set[V]] | cabc.Iterable[tuple[K, V]]) -> None - changed:
method MultiDict.values() -> Iterator[V] → method MultiDict.values() -> cabc.Iterable[V] - changed:
method TypeConversionDict.get(key: K, default: None=…, type: None=…) -> V | None | (key: K, default: D, type: None=…) -> D | V | (key: K, default: D, type: Callable[[V], T]) -> D | T | (key: K, type: Callable[[V], T]) -> T | None → method TypeConversionDict.get(key: K) -> V | None | (key: K, default: V) -> V | (key: K, default: T) -> V | T | (key: str, type: cabc.Callable[[V], T]) -> T | None | (key: str, default: T, type: cabc.Callable[[V], T]) -> T - changed:
static method CombinedMultiDict.fromkeys(keys: Any, value: Any=…) -> NoReturn → static method CombinedMultiDict.fromkeys(keys: t.Any, value: t.Any=…) -> t.NoReturn
- changed:
method DebuggedApplication.log_pin_request() -> Response → method DebuggedApplication.log_pin_request(request: Request) -> Response - added:
export SecurityError - added:
export host_is_trusted - added:
method DebuggedApplication.check_host_trust(environ: WSGIEnvironment) -> bool
- changed:
method DebugReprGenerator.object_repr(obj: type[dict] | t.Callable | type[list] | None) -> str → method DebugReprGenerator.object_repr(obj: t.Any) -> str - changed:
method DebugReprGenerator.regex_repr(obj: t.Pattern) -> str → method DebugReprGenerator.regex_repr(obj: t.Pattern[t.AnyStr]) -> str
- changed:
constructor BadRequestKeyError(arg: str | None=…, *args: t.Any, **kwargs: t.Any) → constructor BadRequestKeyError(arg: object | None=…, *args: t.Any, **kwargs: t.Any) - changed:
constructor HTTPException(description: str | None=…, response: Response | None=…) -> None → constructor HTTPException(description: str | None=…, response: SansIOResponse | None=…) -> None - changed:
constructor InternalServerError(description: str | None=…, response: Response | None=…, original_exception: BaseException | None=…) -> None → constructor InternalServerError(description: str | None=…, response: SansIOResponse | None=…, original_exception: BaseException | None=…) -> None - changed:
constructor MethodNotAllowed(valid_methods: t.Iterable[str] | None=…, description: str | None=…, response: Response | None=…) -> None → constructor MethodNotAllowed(valid_methods: t.Iterable[str] | None=…, description: str | None=…, response: SansIOResponse | None=…) -> None - changed:
constructor RequestedRangeNotSatisfiable(length: int | None=…, units: str=…, description: str | None=…, response: Response | None=…) -> None → constructor RequestedRangeNotSatisfiable(length: int | None=…, units: str=…, description: str | None=…, response: SansIOResponse | None=…) -> None - changed:
constructor Unauthorized(description: str | None=…, response: Response | None=…, www_authenticate: None | (WWWAuthenticate | t.Iterable[WWWAuthenticate])=…) -> None → constructor Unauthorized(description: str | None=…, response: SansIOResponse | None=…, www_authenticate: None | (WWWAuthenticate | t.Iterable[WWWAuthenticate])=…) -> None - changed:
function abort(status: int | Response, *args: t.Any, **kwargs: t.Any) -> t.NoReturn → function abort(status: int | SansIOResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn - changed:
method HTTPException.get_body(environ: WSGIEnvironment | None=…, scope: dict | None=…) -> str → method HTTPException.get_body(environ: WSGIEnvironment | None=…, scope: dict[str, t.Any] | None=…) -> str - changed:
method HTTPException.get_description(environ: WSGIEnvironment | None=…, scope: dict | None=…) -> str → method HTTPException.get_description(environ: WSGIEnvironment | None=…, scope: dict[str, t.Any] | None=…) -> str - changed:
method HTTPException.get_headers(environ: WSGIEnvironment | None=…, scope: dict | None=…) -> list[tuple[str, str]] → method HTTPException.get_headers(environ: WSGIEnvironment | None=…, scope: dict[str, t.Any] | None=…) -> list[tuple[str, str]] - changed:
method HTTPException.get_response(environ: WSGIEnvironment | WSGIRequest | None=…, scope: dict | None=…) -> Response → method HTTPException.get_response(environ: WSGIEnvironment | WSGIRequest | None=…, scope: None=…) -> WSGIResponse | (environ: None=…, scope: dict[str, t.Any]=…) -> SansIOResponse - changed:
method MethodNotAllowed.get_headers(environ: WSGIEnvironment | None=…, scope: dict | None=…) -> list[tuple[str, str]] → method MethodNotAllowed.get_headers(environ: WSGIEnvironment | None=…, scope: dict[str, t.Any] | None=…) -> list[tuple[str, str]] - changed:
method RequestedRangeNotSatisfiable.get_headers(environ: WSGIEnvironment | None=…, scope: dict | None=…) -> list[tuple[str, str]] → method RequestedRangeNotSatisfiable.get_headers(environ: WSGIEnvironment | None=…, scope: dict[str, t.Any] | None=…) -> list[tuple[str, str]] - changed:
method Unauthorized.get_headers(environ: WSGIEnvironment | None=…, scope: dict | None=…) -> list[tuple[str, str]] → method Unauthorized.get_headers(environ: WSGIEnvironment | None=…, scope: dict[str, t.Any] | None=…) -> list[tuple[str, str]] - added:
class MisdirectedRequest(HTTPException) - added:
field MisdirectedRequest.code - added:
field MisdirectedRequest.description
- removed:
field FormDataParser.parse_functions: dict[str, t.Callable[[FormDataParser, t.IO[bytes], str, int | None, dict[str, str]], t_parse_result]] - removed:
method FormDataParser.get_parse_func(mimetype: str, options: dict[str, str]) -> None | t.Callable[[FormDataParser, t.IO[bytes], str, int | None, dict[str, str]], t_parse_result] - changed:
constructor FormDataParser(stream_factory: TStreamFactory | None=…, charset: str | None=…, errors: str | None=…, max_form_memory_size: int | None=…, max_content_length: int | None=…, cls: type[MultiDict] | None=…, silent: bool=…, *, max_form_parts: int | None=…) -> None → constructor FormDataParser(stream_factory: TStreamFactory | None=…, max_form_memory_size: int | None=…, max_content_length: int | None=…, cls: type[MultiDict[str, t.Any]] | None=…, silent: bool=…, *, max_form_parts: int | None=…) -> None - changed:
constructor MultiPartParser(stream_factory: TStreamFactory | None=…, charset: str | None=…, errors: str | None=…, max_form_memory_size: int | None=…, cls: type[MultiDict] | None=…, buffer_size: int=…, max_form_parts: int | None=…) -> None → constructor MultiPartParser(stream_factory: TStreamFactory | None=…, max_form_memory_size: int | None=…, cls: type[MultiDict[str, t.Any]] | None=…, buffer_size: int=…, max_form_parts: int | None=…) -> None - changed:
function parse_form_data(environ: WSGIEnvironment, stream_factory: TStreamFactory | None=…, charset: str | None=…, errors: str | None=…, max_form_memory_size: int | None=…, max_content_length: int | None=…, cls: type[MultiDict] | None=…, silent: bool=…, *, max_form_parts: int | None=…) -> t_parse_result → function parse_form_data(environ: WSGIEnvironment, stream_factory: TStreamFactory | None=…, max_form_memory_size: int | None=…, max_content_length: int | None=…, cls: type[MultiDict[str, t.Any]] | None=…, silent: bool=…, *, max_form_parts: int | None=…) -> t_parse_result - changed:
method MultiPartParser.parse(stream: t.IO[bytes], boundary: bytes, content_length: int | None) -> tuple[MultiDict, MultiDict] → method MultiPartParser.parse(stream: t.IO[bytes], boundary: bytes, content_length: int | None) -> tuple[MultiDict[str, str], MultiDict[str, FileStorage]]
- removed:
function parse_authorization_header(value: str | None) -> ds.Authorization | None - removed:
function parse_www_authenticate_header(value: str | None, on_update: t.Callable[[ds.WWWAuthenticate], None] | None=…) -> ds.WWWAuthenticate - changed:
function dump_cookie(key: str, value: str=…, max_age: timedelta | int | None=…, expires: str | datetime | int | float | None=…, path: str | None=…, domain: str | None=…, secure: bool=…, httponly: bool=…, charset: str | None=…, sync_expires: bool=…, max_size: int=…, samesite: str | None=…) -> str → function dump_cookie(key: str, value: str=…, max_age: timedelta | int | None=…, expires: str | datetime | int | float | None=…, path: str | None=…, domain: str | None=…, secure: bool=…, httponly: bool=…, sync_expires: bool=…, max_size: int=…, samesite: str | None=…, partitioned: bool=…) -> str - changed:
function dump_header(iterable: dict[str, t.Any] | t.Iterable[t.Any], allow_token: bool | None=…) -> str → function dump_header(iterable: dict[str, t.Any] | t.Iterable[t.Any]) -> str - changed:
function parse_cache_control_header(value: str | None, on_update: _t_cc_update, cls: None=…) -> ds.RequestCacheControl | (value: str | None, on_update: _t_cc_update, cls: type[_TAnyCC]) -> _TAnyCC → function parse_cache_control_header(value: str | None, on_update: t.Callable[[ds.cache_control._CacheControl], None] | None=…) -> ds.RequestCacheControl | (value: str | None, on_update: t.Callable[[ds.cache_control._CacheControl], None] | None=…, cls: type[_TAnyCC]=…) -> _TAnyCC - changed:
function parse_cookie(header: WSGIEnvironment | str | None, charset: str | None=…, errors: str | None=…, cls: type[ds.MultiDict] | None=…) -> ds.MultiDict[str, str] → function parse_cookie(header: WSGIEnvironment | str | None, cls: type[ds.MultiDict[str, str]] | None=…) -> ds.MultiDict[str, str] - changed:
function parse_csp_header(value: str | None, on_update: _t_csp_update, cls: None=…) -> ds.ContentSecurityPolicy | (value: str | None, on_update: _t_csp_update, cls: type[_TAnyCSP]) -> _TAnyCSP → function parse_csp_header(value: str | None, on_update: t.Callable[[ds.ContentSecurityPolicy], None] | None=…) -> ds.ContentSecurityPolicy | (value: str | None, on_update: t.Callable[[ds.ContentSecurityPolicy], None] | None=…, cls: type[_TAnyCSP]=…) -> _TAnyCSP - changed:
function parse_dict_header(value: str, cls: type[dict] | None=…) -> dict[str, str] → function parse_dict_header(value: str) -> dict[str, str | None] - changed:
function quote_header_value(value: t.Any, extra_chars: str | None=…, allow_token: bool=…) -> str → function quote_header_value(value: t.Any, allow_token: bool=…) -> str - changed:
function unquote_etag(etag: str | None) -> tuple[str, bool] | tuple[None, None] → function unquote_etag(etag: str) -> tuple[str, bool] | (etag: None) -> tuple[None, None] - changed:
function unquote_header_value(value: str, is_filename: bool | None=…) -> str → function unquote_header_value(value: str) -> str
- changed:
constructor LocalManager(locals: None | (Local | LocalStack | t.Iterable[Local | LocalStack])=…) -> None → constructor LocalManager(locals: None | (Local | LocalStack[t.Any] | t.Iterable[Local | LocalStack[t.Any]])=…) -> None - changed:
function release_local(local: Local | LocalStack) -> None → function release_local(local: Local | LocalStack[t.Any]) -> None
- changed:
function check_type(context: str, obj: object, need: t.Type=…) -> None → function check_type(context: str, obj: object, need: type=…) -> None
- changed:
constructor SharedDataMiddleware(app: WSGIApplication, exports: dict[str, str | tuple[str, str]] | t.Iterable[tuple[str, str | tuple[str, str]]], disallow: None=…, cache: bool=…, cache_timeout: int=…, fallback_mimetype: str=…) -> None → constructor SharedDataMiddleware(app: WSGIApplication, exports: cabc.Mapping[str, str | tuple[str, str]] | t.Iterable[tuple[str, str | tuple[str, str]]], disallow: None=…, cache: bool=…, cache_timeout: int=…, fallback_mimetype: str=…) -> None
- changed:
field NumberConverter.num_convert: t.Callable → field NumberConverter.num_convert: t.Callable[[t.Any], t.Any] - added:
field PathConverter.part_isolating
- changed:
constructor BuildError(endpoint: str, values: t.Mapping[str, t.Any], method: str | None, adapter: MapAdapter | None=…) -> None → constructor BuildError(endpoint: t.Any, values: t.Mapping[str, t.Any], method: str | None, adapter: MapAdapter | None=…) -> None - changed:
constructor RequestAliasRedirect(matched_values: t.Mapping[str, t.Any], endpoint: str) -> None → constructor RequestAliasRedirect(matched_values: t.Mapping[str, t.Any], endpoint: t.Any) -> None - changed:
method RequestRedirect.get_response(environ: WSGIEnvironment | Request | None=…, scope: dict | None=…) -> Response → method RequestRedirect.get_response(environ: WSGIEnvironment | Request | None=…, scope: dict[str, t.Any] | None=…) -> Response
- changed:
constructor Map(rules: t.Iterable[RuleFactory] | None=…, default_subdomain: str=…, charset: str | None=…, strict_slashes: bool=…, merge_slashes: bool=…, redirect_defaults: bool=…, converters: t.Mapping[str, type[BaseConverter]] | None=…, sort_parameters: bool=…, sort_key: t.Callable[[t.Any], t.Any] | None=…, encoding_errors: str | None=…, host_matching: bool=…) -> None → constructor Map(rules: t.Iterable[RuleFactory] | None=…, default_subdomain: str=…, strict_slashes: bool=…, merge_slashes: bool=…, redirect_defaults: bool=…, converters: t.Mapping[str, type[BaseConverter]] | None=…, sort_parameters: bool=…, sort_key: t.Callable[[t.Any], t.Any] | None=…, host_matching: bool=…) -> None - changed:
method Map.is_endpoint_expecting(endpoint: str, *arguments: str) -> bool → method Map.is_endpoint_expecting(endpoint: t.Any, *arguments: str) -> bool - changed:
method Map.iter_rules(endpoint: str | None=…) -> t.Iterator[Rule] → method Map.iter_rules(endpoint: t.Any | None=…) -> t.Iterator[Rule] - changed:
method MapAdapter.build(endpoint: str, values: t.Mapping[str, t.Any] | None=…, method: str | None=…, force_external: bool=…, append_unknown: bool=…, url_scheme: str | None=…) -> str → method MapAdapter.build(endpoint: t.Any, values: t.Mapping[str, t.Any] | None=…, method: str | None=…, force_external: bool=…, append_unknown: bool=…, url_scheme: str | None=…) -> str - changed:
method MapAdapter.make_alias_redirect_url(path: str, endpoint: str, values: t.Mapping[str, t.Any], method: str, query_args: t.Mapping[str, t.Any] | str) -> str → method MapAdapter.make_alias_redirect_url(path: str, endpoint: t.Any, values: t.Mapping[str, t.Any], method: str, query_args: t.Mapping[str, t.Any] | str) -> str - changed:
method MapAdapter.match(path_info: str | None=…, method: str | None=…, return_rule: t.Literal[False]=…, query_args: t.Mapping[str, t.Any] | str | None=…, websocket: bool | None=…) -> tuple[str, t.Mapping[str, t.Any]] | (path_info: str | None=…, method: str | None=…, return_rule: t.Literal[True]=…, query_args: t.Mapping[str, t.Any] | str | None=…, websocket: bool | None=…) -> tuple[Rule, t.Mapping… → method MapAdapter.match(path_info: str | None=…, method: str | None=…, return_rule: t.Literal[False]=…, query_args: t.Mapping[str, t.Any] | str | None=…, websocket: bool | None=…) -> tuple[t.Any, t.Mapping[str, t.Any]] | (path_info: str | None=…, method: str | None=…, return_rule: t.Literal[True]=…, query_args: t.Mapping[str, t.Any] | str | None=…, websocket: bool | None=…) -> tuple[Rule, t.Mappi… - added:
property Map.merge_slashes -> bool
- changed:
constructor Rule(string: str, defaults: t.Mapping[str, t.Any] | None=…, subdomain: str | None=…, methods: t.Iterable[str] | None=…, build_only: bool=…, endpoint: str | None=…, strict_slashes: bool | None=…, merge_slashes: bool | None=…, redirect_to: str | t.Callable[..., str] | None=…, alias: bool=…, host: str | None=…, websocket: bool=…) -> None → constructor Rule(string: str, defaults: t.Mapping[str, t.Any] | None=…, subdomain: str | None=…, methods: t.Iterable[str] | None=…, build_only: bool=…, endpoint: t.Any | None=…, strict_slashes: bool | None=…, merge_slashes: bool | None=…, redirect_to: str | t.Callable[..., str] | None=…, alias: bool=…, host: str | None=…, websocket: bool=…) -> None - changed:
function parse_converter_args(argstr: str) -> tuple[t.Tuple, dict[str, t.Any]] → function parse_converter_args(argstr: str) -> tuple[tuple[t.Any, ...], dict[str, t.Any]] - changed:
method Rule.get_converter(variable_name: str, converter_name: str, args: t.Tuple, kwargs: t.Mapping[str, t.Any]) -> BaseConverter → method Rule.get_converter(variable_name: str, converter_name: str, args: tuple[t.Any, ...], kwargs: t.Mapping[str, t.Any]) -> BaseConverter
- changed:
function parse_cookie(cookie: str | None=…, charset: str | None=…, errors: str | None=…, cls: type[ds.MultiDict] | None=…) -> ds.MultiDict[str, str] → function parse_cookie(cookie: str | None=…, cls: type[ds.MultiDict[str, str]] | None=…) -> ds.MultiDict[str, str]
- removed:
method MultipartDecoder.last_newline(data: bytes) -> int
- removed:
property Request.charset -> str - removed:
property Request.encoding_errors -> str - removed:
property Request.url_charset -> str - changed:
field Request.dict_storage_class: type[MultiDict] → field Request.dict_storage_class: type[MultiDict[str, t.Any]] - changed:
field Request.list_storage_class: type[t.List] → field Request.list_storage_class: type[list[t.Any]] - changed:
field Request.parameter_storage_class: type[MultiDict] → field Request.parameter_storage_class: type[MultiDict[str, t.Any]]
- removed:
property Response.charset -> str - changed:
method Response.delete_cookie(key: str, path: str | None=…, domain: str | None=…, secure: bool=…, httponly: bool=…, samesite: str | None=…) -> None → method Response.delete_cookie(key: str, path: str | None=…, domain: str | None=…, secure: bool=…, httponly: bool=…, samesite: str | None=…, partitioned: bool=…) -> None - changed:
method Response.set_cookie(key: str, value: str=…, max_age: timedelta | int | None=…, expires: str | datetime | int | float | None=…, path: str | None=…, domain: str | None=…, secure: bool=…, httponly: bool=…, samesite: str | None=…) -> None → method Response.set_cookie(key: str, value: str=…, max_age: timedelta | int | None=…, expires: str | datetime | int | float | None=…, path: str | None=…, domain: str | None=…, secure: bool=…, httponly: bool=…, samesite: str | None=…, partitioned: bool=…) -> None
- changed:
function get_host(scheme: str, host_header: str | None, server: tuple[str, int | None] | None=…, trusted_hosts: t.Iterable[str] | None=…) -> str → function get_host(scheme: str, host_header: str | None, server: tuple[str, int | None] | None=…, trusted_hosts: t.Collection[str] | None=…) -> str - changed:
function host_is_trusted(hostname: str, trusted_list: t.Iterable[str]) -> bool → function host_is_trusted(hostname: str | None, trusted_list: t.Collection[str] | None=…) -> bool
- changed:
function safe_join(directory: str, *pathnames: str) -> str | None → function safe_join(directory: str, *untrusted: str) -> str | None
- added:
variable connection_dropped_errors - added:
variable connection_dropped_errors: tuple[type[Exception], ...]
- removed:
class BaseURL(_URLTuple) - removed:
class BytesURL(BaseURL) - removed:
class URL(BaseURL) - removed:
function url_decode(s: t.AnyStr, charset: str=…, include_empty: bool=…, errors: str=…, separator: str=…, cls: type[ds.MultiDict] | None=…) -> ds.MultiDict[str, str] - removed:
function url_decode_stream(stream: t.IO[bytes], charset: str=…, include_empty: bool=…, errors: str=…, separator: bytes=…, cls: type[ds.MultiDict] | None=…, limit: int | None=…) -> ds.MultiDict[str, str] - removed:
function url_encode(obj: t.Mapping[str, str] | t.Iterable[tuple[str, str]], charset: str=…, sort: bool=…, key: t.Callable[[tuple[str, str]], t.Any] | None=…, separator: str=…) -> str - removed:
function url_encode_stream(obj: t.Mapping[str, str] | t.Iterable[tuple[str, str]], stream: t.IO[str] | None=…, charset: str=…, sort: bool=…, key: t.Callable[[tuple[str, str]], t.Any] | None=…, separator: str=…) -> None - removed:
function url_fix(s: str, charset: str=…) -> str - removed:
function url_join(base: str | tuple[str, str, str, str, str], url: str | tuple[str, str, str, str, str], allow_fragments: bool=…) -> str - removed:
function url_parse(url: str, scheme: str | None=…, allow_fragments: bool=…) -> BaseURL - removed:
function url_quote(string: str | bytes, charset: str=…, errors: str=…, safe: str | bytes=…, unsafe: str | bytes=…) -> str - removed:
function url_quote_plus(string: str, charset: str=…, errors: str=…, safe: str=…) -> str - removed:
function url_unparse(components: tuple[str, str, str, str, str]) -> str - removed:
function url_unquote(s: str | bytes, charset: str=…, errors: str=…, unsafe: str=…) -> str - removed:
function url_unquote_plus(s: str | bytes, charset: str=…, errors: str=…) -> str - removed:
method BaseURL.decode_netloc() -> str - removed:
method BaseURL.decode_query(*args: t.Any, **kwargs: t.Any) -> ds.MultiDict[str, str] - removed:
method BaseURL.encode_netloc() -> str - removed:
method BaseURL.get_file_location(pathformat: str | None=…) -> tuple[str | None, str | None] - removed:
method BaseURL.join(*args: t.Any, **kwargs: t.Any) -> BaseURL - removed:
method BaseURL.replace(**kwargs: t.Any) -> BaseURL - removed:
method BaseURL.to_iri_tuple() -> BaseURL - removed:
method BaseURL.to_uri_tuple() -> BaseURL - removed:
method BaseURL.to_url() -> str - removed:
method BytesURL.decode(charset: str=…, errors: str=…) -> URL - removed:
method BytesURL.encode_netloc() -> bytes - removed:
method URL.encode(charset: str=…, errors: str=…) -> BytesURL - removed:
property BaseURL.ascii_host -> str | None - removed:
property BaseURL.auth -> str | None - removed:
property BaseURL.host -> str | None - removed:
property BaseURL.password -> str | None - removed:
property BaseURL.port -> int | None - removed:
property BaseURL.raw_password -> str | None - removed:
property BaseURL.raw_username -> str | None - removed:
property BaseURL.username -> str | None - changed:
function iri_to_uri(iri: str | tuple[str, str, str, str, str], charset: str | None=…, errors: str | None=…, safe_conversion: bool | None=…) -> str → function iri_to_uri(iri: str) -> str - changed:
function uri_to_iri(uri: str | tuple[str, str, str, str, str], charset: str | None=…, errors: str | None=…) -> str → function uri_to_iri(uri: str) -> str
- changed:
function send_file(path_or_file: os.PathLike | str | t.IO[bytes], environ: WSGIEnvironment, mimetype: str | None=…, as_attachment: bool=…, download_name: str | None=…, conditional: bool=…, etag: bool | str=…, last_modified: datetime | int | float | None=…, max_age: None | (int | t.Callable[[str | None], int | None])=…, use_x_sendfile: bool=…, response_class: type[Response] | None=…, _root_path: o… → function send_file(path_or_file: os.PathLike[str] | str | t.IO[bytes], environ: WSGIEnvironment, mimetype: str | None=…, as_attachment: bool=…, download_name: str | None=…, conditional: bool=…, etag: bool | str=…, last_modified: datetime | int | float | None=…, max_age: None | (int | t.Callable[[str | None], int | None])=…, use_x_sendfile: bool=…, response_class: type[Response] | None=…, _root_pa… - changed:
function send_from_directory(directory: os.PathLike | str, path: os.PathLike | str, environ: WSGIEnvironment, **kwargs: t.Any) -> Response → function send_from_directory(directory: os.PathLike[str] | str, path: os.PathLike[str] | str, environ: WSGIEnvironment, **kwargs: t.Any) -> Response
- removed:
property Request.json -> t.Any | None - added:
property Request.json -> t.Any
- removed:
function make_chunk_iter(stream: t.Iterable[bytes] | t.IO[bytes], separator: bytes, limit: int | None=…, buffer_size: int=…, cap_at_buffer: bool=…) -> t.Iterator[bytes] - removed:
function make_line_iter(stream: t.Iterable[bytes] | t.IO[bytes], limit: int | None=…, buffer_size: int=…, cap_at_buffer: bool=…) -> t.Iterator[bytes] - changed:
function get_current_url(environ: WSGIEnvironment, root_only: bool=…, strip_querystring: bool=…, host_only: bool=…, trusted_hosts: t.Iterable[str] | None=…) -> str → function get_current_url(environ: WSGIEnvironment, root_only: bool=…, strip_querystring: bool=…, host_only: bool=…, trusted_hosts: t.Collection[str] | None=…) -> str - changed:
function get_host(environ: WSGIEnvironment, trusted_hosts: t.Iterable[str] | None=…) -> str → function get_host(environ: WSGIEnvironment, trusted_hosts: t.Collection[str] | None=…) -> str - changed:
function get_path_info(environ: WSGIEnvironment, charset: t.Any=…, errors: str | None=…) -> str → function get_path_info(environ: WSGIEnvironment) -> str