docs/changes/3.1.0.rst
.. falcon-release: 2022-03-25
This release contains several refinements to request validation and error handling, along with some tweaks to response handling for static and downloadable files.
Due to popular demand, :class:~falcon.testing.TestClient and
:class:~falcon.testing.ASGIConductor now expose convenience shorthand aliases
for the simulate_* methods, i.e.,
:func:~falcon.testing.TestClient.simulate_get is now also available as
:func:~falcon.testing.TestClient.get, etc.
Some important bugs were also fixed to ensure applications properly clean up response streams and do not hang when reading request bodies that are streamed using chunked transfer encoding.
This release also adds support for CPython 3.10 and deprecates CPython 3.6.
#1966 <https://github.com/falconry/falcon/issues/1966>__)The :func:jsonschema.validate <falcon.media.validators.jsonschema.validate>
decorator now raises an instance of :class:~falcon.MediaValidationError
instead of the generic :class:~falcon.HTTPBadRequest for request media
validation failures. Although the default behavior is kept unaltered in a
backwards-compatible fashion (as the specialized exception subclasses the
generic one), but it can now be easily customized by adding an error handler
for the new class. (#1320 <https://github.com/falconry/falcon/issues/1320>__)
Due to popular demand, :class:~falcon.testing.TestClient and
:class:~falcon.testing.ASGIConductor now expose convenience shorthand aliases
for the simulate_* methods, i.e.,
:func:~falcon.testing.TestClient.simulate_get is now also available as
:func:~falcon.testing.TestClient.get, etc. (#1806 <https://github.com/falconry/falcon/issues/1806>__)
The :attr:Request.range <falcon.Request.range> property now has stricter
validation:
:func:Static routes <falcon.App.add_static_route> now support Range
requests. This is useful for streaming media and resumable downloads. (#1858 <https://github.com/falconry/falcon/issues/1858>__)
Added a :attr:Response.viewable_as <falcon.Response.viewable_as> property;
this is similar to :attr:Response.downloadable_as <falcon.Response.downloadable_as>
but with an "inline" disposition type so the response will still be displayed
in the browser. (#1951 <https://github.com/falconry/falcon/issues/1951>__)
Added support for passing :any:pathlib.Path objects as directory in the
:func:~falcon.App.add_static_route method on all targeted Python versions. (#1962 <https://github.com/falconry/falcon/issues/1962>__)
:func:Static routes <falcon.App.add_static_route> now set the
Content-Length header indicating a served file's size
(or length of the rendered content range). (#1991 <https://github.com/falconry/falcon/issues/1991>__)
When called with deprecated positional arguments, methods and class
initializers (such as :class:falcon.HTTPError) will now emit a
user-friendlier warning indicating the fully qualified name of the method in
question. (#2010 <https://github.com/falconry/falcon/issues/2010>__)
close() method of an ASGI
:attr:resp.stream <falcon.asgi.Response.stream> is now guaranteed to be
called even in the case of an exception raised while iterating over the data. (#1943 <https://github.com/falconry/falcon/issues/1943>__)#1963 <https://github.com/falconry/falcon/issues/1963>__)Content-Length known in advance), iterating over
:attr:req.stream <falcon.asgi.Request.stream> could hang until the client had
disconnected. This bug has been fixed, and iteration now stops upon receiving
the last body chunk as expected. (#2024 <https://github.com/falconry/falcon/issues/2024>__)~falcon.routing.compile_uri_template utility method has been
deprecated and will be removed in Falcon 4.0. This function was only employed
in the early versions of the framework, and is expected to have been fully
supplanted by the :class:~falcon.routing.CompiledRouter. In the unlikely case
it is still in active use, its source code can be simply copied into an
affected application. (#1967 <https://github.com/falconry/falcon/issues/1967>__)Many thanks to all the contributors for this release!
abidahmadq <https://github.com/abidahmadq>__andriyor <https://github.com/andriyor>__CaselIT <https://github.com/CaselIT>__Contessina <https://github.com/Contessina>__dflss <https://github.com/dflss>__dimucciojonathan <https://github.com/dimucciojonathan>__forana <https://github.com/forana>__kgriffs <https://github.com/kgriffs>__laurent-chriqui <https://github.com/laurent-chriqui>__maxking <https://github.com/maxking>__mgorny <https://github.com/mgorny>__mihaitodor <https://github.com/mihaitodor>__nix010 <https://github.com/nix010>__signalw <https://github.com/signalw>__the-bets <https://github.com/the-bets>__tipabu <https://github.com/tipabu>__treharne <https://github.com/treharne>__vgerak <https://github.com/vgerak>__vytas7 <https://github.com/vytas7>__