Skip to main content

Async http client/server framework (asyncio)

Project description

Async http client/server framework

aiohttp logo https://travis-ci.org/aio-libs/aiohttp.svg?branch=master https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg https://badge.fury.io/py/aiohttp.svg Chat on Gitter

aiohttp 2.0 release!

For this release we completely refactored low-level implementation of http handling. Finally uvloop gives performance improvement. Overall performance improvement should be around 70-90% compared to 1.x version.

We took opportunity to refactor long standing api design problems across whole package. Client exceptions handling has been cleaned up and now much more straight forward. Client payload management simplified and allows to extend with any custom type. Client connection pool implementation has been redesigned as well, now there is no need for actively releasing response objects, aiohttp handles connection release automatically.

Another major change, we moved aiohttp development to public organization https://github.com/aio-libs

With this amount of api changes we had to make backward incompatible changes. Please check this migration document https://aiohttp.readthedocs.io/en/latest/migration_to_2xx.html

Please report problems or annoyance with with api to https://github.com/aio-libs/aiohttp

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

https://aiohttp.readthedocs.io/

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

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 Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

aiohttp-2.3.0a1-cp36-cp36m-win_amd64.whl (364.3 kB view details)

Uploaded CPython 3.6m Windows x86-64

aiohttp-2.3.0a1-cp36-cp36m-win32.whl (353.0 kB view details)

Uploaded CPython 3.6m Windows x86

aiohttp-2.3.0a1-cp36-cp36m-manylinux1_x86_64.whl (657.4 kB view details)

Uploaded CPython 3.6m

aiohttp-2.3.0a1-cp36-cp36m-manylinux1_i686.whl (629.0 kB view details)

Uploaded CPython 3.6m

aiohttp-2.3.0a1-cp35-cp35m-win_amd64.whl (362.4 kB view details)

Uploaded CPython 3.5m Windows x86-64

aiohttp-2.3.0a1-cp35-cp35m-win32.whl (351.4 kB view details)

Uploaded CPython 3.5m Windows x86

aiohttp-2.3.0a1-cp35-cp35m-manylinux1_x86_64.whl (643.0 kB view details)

Uploaded CPython 3.5m

aiohttp-2.3.0a1-cp35-cp35m-manylinux1_i686.whl (612.9 kB view details)

Uploaded CPython 3.5m

aiohttp-2.3.0a1-cp34-cp34m-win_amd64.whl (357.8 kB view details)

Uploaded CPython 3.4m Windows x86-64

aiohttp-2.3.0a1-cp34-cp34m-win32.whl (350.8 kB view details)

Uploaded CPython 3.4m Windows x86

aiohttp-2.3.0a1-cp34-cp34m-manylinux1_x86_64.whl (649.4 kB view details)

Uploaded CPython 3.4m

aiohttp-2.3.0a1-cp34-cp34m-manylinux1_i686.whl (622.8 kB view details)

Uploaded CPython 3.4m

File details

Details for the file aiohttp-2.3.0a1-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 087d516e5dfc5dafe2d4fe9e4fdca1c88b836ff3c04c6775a23dc565cb53b706
MD5 bd1f39653a687798b1f397eda5314524
BLAKE2b-256 0d1724340ba63ac3d8d06956e36d1a1b0a02317093f35b5385065844db1bf73d

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp36-cp36m-win32.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 2ef09e9d0f2d17d3f722487fcb2ed9bc23cd3629270830500292c63bb9d9de9c
MD5 52b3369805e996e4946e8cd9750bc8fe
BLAKE2b-256 bd72d5c5a4fc200c2d5a5aa54b62e4e2b2f7d3f8d0f1816809843fde7d1ced9b

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3eb45551a8df2250be965287a2f5b070a1cd38469c2a7bd5de6e10b4bc84b759
MD5 989fdbe3330fb12d4fd5aa0ff6d4e670
BLAKE2b-256 755abf968018e2198469f830321b8595b09f48526fd276778bdb6d559bdc81ff

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp36-cp36m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 95323ba78fef8a300f89af8ba7fcd01bfd0a4f7d52a1f916bef8057ccc07d489
MD5 04f5a17ceec4ba28f98ea7d7816ea27a
BLAKE2b-256 e7f6a3476bb1eaf57f1a464f2179d2bd96399602b62a8222fee2458e7d7738cd

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp35-cp35m-win_amd64.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 daf20049b7de13d07c373c34ca026123821999f31784dd50c54aa0a0d61f3bd1
MD5 11d3cc81a3e0fd8c4b54c6d828f08a18
BLAKE2b-256 acfde7493e4728da658ef04be2dace2f37bf5412fc4cff696c44ac8c009bce07

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp35-cp35m-win32.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 d10cef2b4b2766ed5e060b32daa0136dd9742833850ff62b5e30e51b161d5f94
MD5 832644c091b3548ba7506a6952de76da
BLAKE2b-256 8c6dbe7bc0905b8ce5ce02d5ede12af1e1cb1144818d0032aeaea8424e6de7e4

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 47d98eb74ecdfdfcbfaaa75d80cc0e15ad50f941397b403061a5d1d39c196bf9
MD5 4960a5a080dfc3528b2030da4cde2122
BLAKE2b-256 4df465403f83ff58b383082d61c8bd5dfabedc67fcf144f395643810f952ec40

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp35-cp35m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 70c35570b1f0444135b73f1034809c06d6b7c2ba07c60b3efffc22e5b336058a
MD5 2cb85c6292fbc71176c660712eec1627
BLAKE2b-256 027fc7cebef6a2760a3386b754a37cd9a93a192cbac4b08fe2fc5201c6279480

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp34-cp34m-win_amd64.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 054c9a99218d8ff10a6626529acb18180dad5f3adcd14ec0e411b3b15aa24f00
MD5 8e94b5dacbe5c9d1709688892364f55c
BLAKE2b-256 16cbf838c519d58dd2ec0d2d79ec744e7f1e6b7ff8800a2f1f0b3e98b614fc4f

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp34-cp34m-win32.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 96d7656bd2080c35e30cf7a00fed52ab175f2d08d81c2b0a9a2e65f724a82e03
MD5 b564939e0dfe9c63e406a4be457bd47a
BLAKE2b-256 a4e4b3422756dfa5d3827265bd2baa12355daf1fcd45e8a79ce85f1555b6380a

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp34-cp34m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9578b39b1acbb430dc20e043cb49e13345c5303eb5c404a6b763431459ceff52
MD5 ee924a39e5018875db867a2a140ac304
BLAKE2b-256 258622d6e20e13cb2a3066533f21b649c8486b5a1d313a49cec43c7e87e1489c

See more details on using hashes here.

File details

Details for the file aiohttp-2.3.0a1-cp34-cp34m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for aiohttp-2.3.0a1-cp34-cp34m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 95d440abac9c343e72a30e5d4902ef796b936d550decad6d5dee77942515f3be
MD5 64da48f5bbfa3f8bb2c9e4c6d7c44e12
BLAKE2b-256 8094c559e9d5db60110718e951b3b21ac64b1b325b7b117e77dc4812094855ce

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page