Async http client/server framework (asyncio)
Project description
Async http client/server framework
Features
Supports both client and server side of HTTP protocol.
Supports both client and server Web-Sockets out-of-the-box.
Web-server has middlewares and pluggable routing.
Getting started
Client
To retrieve something from the web:
import aiohttp
import asyncio
import async_timeout
async def fetch(session, url):
with async_timeout.timeout(10):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'http://python.org')
print(html)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Server
This is simple usage example:
from aiohttp import web
async def handle(request):
name = request.match_info.get('name', "Anonymous")
text = "Hello, " + name
return web.Response(text=text)
async def wshandler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
if msg.type == web.MsgType.text:
await ws.send_str("Hello, {}".format(msg.data))
elif msg.type == web.MsgType.binary:
await ws.send_bytes(msg.data)
elif msg.type == web.MsgType.close:
break
return ws
app = web.Application()
app.router.add_get('/echo', wshandler)
app.router.add_get('/', handle)
app.router.add_get('/{name}', handle)
web.run_app(app)
Note: examples are written for Python 3.5+ and utilize PEP-492 aka async/await. If you are using Python 3.4 please replace await with yield from and async def with @coroutine e.g.:
async def coro(...): ret = await f()
should be replaced by:
@asyncio.coroutine def coro(...): ret = yield from f()
Documentation
External links
Feel free to make a Pull Request for adding your link to these pages!
Communication channels
aio-libs google group: https://groups.google.com/forum/#!forum/aio-libs
Feel free to post your questions and ideas here.
gitter chat https://gitter.im/aio-libs/Lobby
We support Stack Overflow. Please add aiohttp tag to your question there.
Requirements
Python >= 3.4.2
Optionally you may install the cChardet and aiodns libraries (highly recommended for sake of speed).
License
aiohttp is offered under the Apache 2 license.
Keepsafe
The aiohttp community would like to thank Keepsafe (https://www.getkeepsafe.com) for it’s support in the early days of the project.
Source code
The latest developer version is available in a github repository: https://github.com/aio-libs/aiohttp
Benchmarks
If you are interested in by efficiency, AsyncIO community maintains a list of benchmarks on the official wiki: https://github.com/python/asyncio/wiki/Benchmarks
Changes
2.2.5 (2017-08-03)
Don’t raise deprecation warning on loop.run_until_complete(client.close()) (#2065)
2.2.4 (2017-08-02)
Fix issue with synchronous session closing when using ClientSession as an asynchronous context manager. (#2063)
2.2.3 (2017-07-04)
Fix _CoroGuard for python 3.4
2.2.2 (2017-07-03)
Allow await session.close() along with yield from session.close()
2.2.1 (2017-07-02)
Relax yarl requirement to 0.11+
Backport #2026: session.close is a coroutine (#2029)
2.2.0 (2017-06-20)
Add doc for add_head, update doc for add_get. (#1944)
Fixed consecutive calls for Response.write_eof.
Retain method attributes (e.g.
__doc__
) when registering synchronous handlers for resources. (#1953)Added signal TERM handling in run_app to gracefully exit (#1932)
Fix websocket issues caused by frame fragmentation. (#1962)
Raise RuntimeError is you try to set the Content Length and enable chunked encoding at the same time (#1941)
Small update for unittest_run_loop
Use CIMultiDict for ClientRequest.skip_auto_headers (#1970)
Fix wrong startup sequence: test server and run_app() are not raise DeprecationWarning now (#1947)
Make sure cleanup signal is sent if startup signal has been sent (#1959)
Fixed server keep-alive handler, could cause 100% cpu utilization (#1955)
Connection can be destroyed before response get processed if await aiohttp.request(..) is used (#1981)
MultipartReader does not work with -OO (#1969)
Fixed ClientPayloadError with blank Content-Encoding header (#1931)
Support deflate encoding implemented in httpbin.org/deflate (#1918)
Fix BadStatusLine caused by extra CRLF after POST data (#1792)
Keep a reference to ClientSession in response object (#1985)
Deprecate undocumented app.on_loop_available signal (#1978)
2.1.0 (2017-05-26)
Added support for experimental async-tokio event loop written in Rust https://github.com/PyO3/tokio
Write to transport \r\n before closing after keepalive timeout, otherwise client can not detect socket disconnection. (#1883)
Only call loop.close in run_app if the user did not supply a loop. Useful for allowing clients to specify their own cleanup before closing the asyncio loop if they wish to tightly control loop behavior
Content disposition with semicolon in filename (#917)
Added request_info to response object and ClientResponseError. (#1733)
Added history to ClientResponseError. (#1741)
Allow to disable redirect url re-quoting (#1474)
Handle RuntimeError from transport (#1790)
Dropped “%O” in access logger (#1673)
Added args and kwargs to unittest_run_loop. Useful with other decorators, for example @patch. (#1803)
Added iter_chunks to response.content object. (#1805)
Avoid creating TimerContext when there is no timeout to allow compatibility with Tornado. (#1817) (#1180)
Add proxy_from_env to ClientRequest to read from environment variables. (#1791)
Add DummyCookieJar helper. (#1830)
Fix assertion errors in Python 3.4 from noop helper. (#1847)
Do not unquote + in match_info values (#1816)
Use Forwarded, X-Forwarded-Scheme and X-Forwarded-Host for better scheme and host resolution. (#1134)
Fix sub-application middlewares resolution order (#1853)
Fix applications comparison (#1866)
Fix static location in index when prefix is used (#1662)
Make test server more reliable (#1896)
Extend list of web exceptions, add HTTPUnprocessableEntity, HTTPFailedDependency, HTTPInsufficientStorage status codes (#1920)
2.0.7 (2017-04-12)
Fix pypi distribution
Fix exception description (#1807)
Handle socket error in FileResponse (#1773)
Cancel websocket heartbeat on close (#1793)
2.0.6 (2017-04-04)
Keeping blank values for request.post() and multipart.form() (#1765)
TypeError in data_received of ResponseHandler (#1770)
Fix web.run_app not to bind to default host-port pair if only socket is passed (#1786)
2.0.5 (2017-03-29)
Memory leak with aiohttp.request (#1756)
Disable cleanup closed ssl transports by default.
Exception in request handling if the server responds before the body is sent (#1761)
2.0.4 (2017-03-27)
Memory leak with aiohttp.request (#1756)
Encoding is always UTF-8 in POST data (#1750)
Do not add “Content-Disposition” header by default (#1755)
2.0.3 (2017-03-24)
Call https website through proxy will cause error (#1745)
Fix exception on multipart/form-data post if content-type is not set (#1743)
2.0.2 (2017-03-21)
Fixed Application.on_loop_available signal (#1739)
Remove debug code
2.0.1 (2017-03-21)
Fix allow-head to include name on route (#1737)
Fixed AttributeError in WebSocketResponse.can_prepare (#1736)
2.0.0 (2017-03-20)
Added json to ClientSession.request() method (#1726)
Added session’s raise_for_status parameter, automatically calls raise_for_status() on any request. (#1724)
response.json() raises ClientReponseError exception if response’s content type does not match (#1723)
Cleanup timer and loop handle on any client exception.
Deprecate loop parameter for Application’s constructor
2.0.0rc1 (2017-03-15)
Properly handle payload errors (#1710)
Added ClientWebSocketResponse.get_extra_info() (#1717)
It is not possible to combine Transfer-Encoding and chunked parameter, same for compress and Content-Encoding (#1655)
Connector’s limit parameter indicates total concurrent connections. New limit_per_host added, indicates total connections per endpoint. (#1601)
Use url’s raw_host for name resolution (#1685)
Change ClientResponse.url to yarl.URL instance (#1654)
Add max_size parameter to web.Request reading methods (#1133)
Web Request.post() stores data in temp files (#1469)
Add the allow_head=True keyword argument for add_get (#1618)
run_app and the Command Line Interface now support serving over Unix domain sockets for faster inter-process communication.
run_app now supports passing a preexisting socket object. This can be useful e.g. for socket-based activated applications, when binding of a socket is done by the parent process.
Implementation for Trailer headers parser is broken (#1619)
Fix FileResponse to not fall on bad request (range out of file size)
Fix FileResponse to correct stream video to Chromes
Deprecate public low-level api (#1657)
Deprecate encoding parameter for ClientSession.request() method
Dropped aiohttp.wsgi (#1108)
Dropped version from ClientSession.request() method
Dropped websocket version 76 support (#1160)
Dropped: aiohttp.protocol.HttpPrefixParser (#1590)
Dropped: Servers response’s .started, .start() and .can_start() method (#1591)
Dropped: Adding sub app via app.router.add_subapp() is deprecated use app.add_subapp() instead (#1592)
Dropped: Application.finish() and Application.register_on_finish() (#1602)
Dropped: web.Request.GET and web.Request.POST
Dropped: aiohttp.get(), aiohttp.options(), aiohttp.head(), aiohttp.post(), aiohttp.put(), aiohttp.patch(), aiohttp.delete(), and aiohttp.ws_connect() (#1593)
Dropped: aiohttp.web.WebSocketResponse.receive_msg() (#1605)
Dropped: ServerHttpProtocol.keep_alive_timeout attribute and keep-alive, keep_alive_on, timeout, log constructor parameters (#1606)
Dropped: TCPConnector’s` .resolve, .resolved_hosts, .clear_resolved_hosts() attributes and resolve constructor parameter (#1607)
Dropped ProxyConnector (#1609)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for aiohttp-2.3.0a4-cp36-cp36m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9ab72d17aa585bc06cd24917710a4adbc1a7d80bb0fdbad6c6d27e427cb989d6 |
|
MD5 | a6aae1e06894ee95e9c28ecdfb62c8f7 |
|
BLAKE2b-256 | c77d13e7f6fcda938b65a0068ee9861a9a71265656aed30db450401029b20cff |
Hashes for aiohttp-2.3.0a4-cp36-cp36m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 99beb63631a87a2c205a2828fddf35486e977b76a4e19274d98b2d11e06f2ecd |
|
MD5 | b9683cd93fee65c0332e38a727f198c2 |
|
BLAKE2b-256 | 0e46a0ae472df4335383966d8a660564c6d648505e736adc4ae0dda688533b90 |
Hashes for aiohttp-2.3.0a4-cp36-cp36m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 917d71a99f35ceb28b26cb14a21bd8c01660e8a63bdb1600271b93d52aeed797 |
|
MD5 | a38e05216a28805c737d55d01784620c |
|
BLAKE2b-256 | 22b4565faf69b1f88e3993319d80254634e6365141598ab3e9308f585190d3c6 |
Hashes for aiohttp-2.3.0a4-cp36-cp36m-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c601b3af0ae6d2a997158ea485c0b6a97f6b301ccb12e263bb12dbbca3429fd5 |
|
MD5 | 43fad310ea428e41b55f530991e8e0e4 |
|
BLAKE2b-256 | 0ee1128acb80d8a1eeb78c237caf81b6424202afe8eb4ad8c8fabc874669386a |
Hashes for aiohttp-2.3.0a4-cp35-cp35m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b38fd7d780419a9dc768a917536229ce10ed911f1f6f4b0e781ae019cf09bc6b |
|
MD5 | 761c4d4f372cb47362c0e9665193b49c |
|
BLAKE2b-256 | be27ab223df951455218528a1acc73f0c77c69ff46cf719de887c031cdb86a9c |
Hashes for aiohttp-2.3.0a4-cp35-cp35m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 354426c524bc37d4b6496132acf7c4ce8baa2c5442c02ee9400a3cb81c8e76ee |
|
MD5 | 75b74edfa5b4c449e07b27bf5f284660 |
|
BLAKE2b-256 | 26a77bb00f7b1d4ded4b06854278985175dfd0e513e279fcbc415e7a5f32164d |
Hashes for aiohttp-2.3.0a4-cp35-cp35m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 07713924ad7bb441cc3630496b2b4729504d8c945cd93fef0d2350769d0872ff |
|
MD5 | 6332d40ace12dae846dd11080d7963ce |
|
BLAKE2b-256 | 3f212703e125dbabc31b157264720abb19f65568df0c172c5350eec3dde43b9b |
Hashes for aiohttp-2.3.0a4-cp35-cp35m-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | cc5a2638c3771c4d3a446bebd7e8965cd75a2b5861cd71500de9da3ec731b9ed |
|
MD5 | 5a365045420d0ff1d181ac7f64b68ed2 |
|
BLAKE2b-256 | 8ad85ac7411208a95086208fe2e555b42c30b4f7732064fe882e6dada107fce7 |
Hashes for aiohttp-2.3.0a4-cp34-cp34m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 22960731ec358e3c217361f4ea7dbbcf1e2fb4bace8349d8cbb259351ef24f1d |
|
MD5 | a81ffdb850e2f610a55012e02b4c7ad0 |
|
BLAKE2b-256 | 84238aee4c040e77bc542830029fcb77cfdc42e2ae5940f27a2286b7511c112e |
Hashes for aiohttp-2.3.0a4-cp34-cp34m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c74e76778eaca0ac55b9eb1a06eacfdf628a3408e572f9829d0c5d442e41dc86 |
|
MD5 | 7dee011298bb28c2ff734c6ddf20152f |
|
BLAKE2b-256 | 5edff9c58d89a4342326ec5f6284156d72974d28b3f09b9d3122594efb75042f |
Hashes for aiohttp-2.3.0a4-cp34-cp34m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a2af3929b363eca8b8814b45003967ea7d10d6fb783c4c2de3200bc9550fda45 |
|
MD5 | 379df9fe257cb525ac71c76e7c901903 |
|
BLAKE2b-256 | d41b5f6262601f842a8a2b697cb0327925c5b4e144cac9599cbc5bd462841a92 |
Hashes for aiohttp-2.3.0a4-cp34-cp34m-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dad4fc7e84b8622bfb01fdf06701bed12d51a8058df8c139ed770b417dc040c0 |
|
MD5 | e1ed54e36918c6ea1b9ff3b6570cbb9d |
|
BLAKE2b-256 | 9043a431bee0903f36a44c291f32456dff11436ba5271869cee28cba6252924e |