Welcome to aiohttp 3.1 release.
This is an incremental release, fully backward compatible with aiohttp 3.0.
But we have added several new features.
The most visible one is app.add_routes()
(an alias for existing
app.router.add_routes()
. The addition is very important because
all aiohttp docs now uses app.add_routes()
call in code
snippets. All your existing code still do register routes / resource
without any warning but you've got the idea for a favorite way: noisy
app.router.add_get()
is replaced by app.add_routes()
.
The library does not make a preference between decorators:
routes = web.RouteTableDef() @routes.get('/') async def hello(request): return web.Response(text="Hello, world") app.add_routes(routes)
and route tables as a list:
async def hello(request): return web.Response(text="Hello, world") app.add_routes([web.get('/', hello)])
Both ways are equal, user may decide basing on own code taste.
Also we have a lot of minor features, bug fixes and documentation updates, see below.
- Relax JSON content-type checking in the
ClientResponse.json()
to allow "application/xxx+json" instead of strict "application/json". (#2206) - Bump C HTTP parser to version 2.8 (#2730)
- Accept a coroutine as an application factory in
web.run_app
and gunicorn worker. (#2739) - Implement application cleanup context (
app.cleanup_ctx
property). (#2747) - Make
writer.write_headers
a coroutine. (#2762) - Add tracking signals for getting request/response bodies. (#2767)
- Deprecate ClientResponseError.code in favor of .status to keep similarity with response classes. (#2781)
- Implement
app.add_routes()
method. (#2787) - Implement
web.static()
andRouteTableDef.static()
API. (#2795) - Install a test event loop as default by
asyncio.set_event_loop()
. The change affects aiohttp test utils but backward compatibility is not broken for 99.99% of use cases. (#2804) - Refactor
ClientResponse
constructor: make logically required constructor arguments mandatory, drop_post_init()
method. (#2820) - Use
app.add_routes()
in server docs everywhere (#2830) - Websockets refactoring, all websocket writer methods are converted into coroutines. (#2836)
- Provide
Content-Range
header forRange
requests (#2844)
- Fix websocket client return EofStream. (#2784)
- Fix websocket demo. (#2789)
- Property
BaseRequest.http_range
now returns a python-like slice when requesting the tail of the range. It's now indicated by a negative value inrange.start
rather then inrange.stop
(#2805) - Close a connection if an unexpected exception occurs while sending a request (#2827)
- Fix firing DNS tracing events. (#2841)
- Change
ClientResponse.json()
documentation to reflect that it now allows "application/xxx+json" content-types (#2206) - Document behavior when cchardet detects encodings that are unknown to Python. (#2732)
- Add diagrams for tracing request life style. (#2748)
- Drop removed functionality for passing
StreamReader
as data at client side. (#2793)