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

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 http://aiohttp.readthedocs.io/en/latest/migration.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

async def fetch(session, url):
    with aiohttp.Timeout(10, loop=session.loop):
        async with session.get(url) as response:
            return await response.text()

async def main(loop):
    async with aiohttp.ClientSession(loop=loop) as session:
        html = await fetch(session, 'http://python.org')
        print(html)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(loop))

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/

Discussion list

aio-libs google group: https://groups.google.com/forum/#!forum/aio-libs

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.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

This version

2.2.2

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aiohttp-2.2.2.tar.gz (787.8 kB view details)

Uploaded Source

Built Distributions

aiohttp-2.2.2-cp36-cp36m-win_amd64.whl (319.9 kB view details)

Uploaded CPython 3.6m Windows x86-64

aiohttp-2.2.2-cp36-cp36m-win32.whl (311.1 kB view details)

Uploaded CPython 3.6m Windows x86

aiohttp-2.2.2-cp36-cp36m-manylinux1_x86_64.whl (770.5 kB view details)

Uploaded CPython 3.6m

aiohttp-2.2.2-cp36-cp36m-manylinux1_i686.whl (748.9 kB view details)

Uploaded CPython 3.6m

aiohttp-2.2.2-cp35-cp35m-win_amd64.whl (318.3 kB view details)

Uploaded CPython 3.5m Windows x86-64

aiohttp-2.2.2-cp35-cp35m-win32.whl (309.6 kB view details)

Uploaded CPython 3.5m Windows x86

aiohttp-2.2.2-cp35-cp35m-manylinux1_x86_64.whl (758.8 kB view details)

Uploaded CPython 3.5m

aiohttp-2.2.2-cp35-cp35m-manylinux1_i686.whl (735.7 kB view details)

Uploaded CPython 3.5m

aiohttp-2.2.2-cp34-cp34m-win_amd64.whl (313.8 kB view details)

Uploaded CPython 3.4m Windows x86-64

aiohttp-2.2.2-cp34-cp34m-win32.whl (308.5 kB view details)

Uploaded CPython 3.4m Windows x86

aiohttp-2.2.2-cp34-cp34m-manylinux1_x86_64.whl (559.3 kB view details)

Uploaded CPython 3.4m

aiohttp-2.2.2-cp34-cp34m-manylinux1_i686.whl (535.4 kB view details)

Uploaded CPython 3.4m

File details

Details for the file aiohttp-2.2.2.tar.gz.

File metadata

  • Download URL: aiohttp-2.2.2.tar.gz
  • Upload date:
  • Size: 787.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for aiohttp-2.2.2.tar.gz
Algorithm Hash digest
SHA256 eee762d165170ad19eecc22a04614b1e66628ab4765ce6ac671b70757be93608
MD5 4cae55fe71ef39ff9af05a99b33f082c
BLAKE2b-256 f1cc828ce95d4d638f54936bbd1f896a75ba937839b17a63a57c1c491db6c26d

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 28b8ba000ca219a62384f9d3c0c7effe6c5ad0b0d02fba75dd3b7c1c1b705b5f
MD5 090e6381ad611d72afcbf0b746e1dca1
BLAKE2b-256 8cbda4779c719bb6370b93615e3c3e74cce6694d874453096b919938915c0b7b

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp36-cp36m-win32.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 078e9ee8242e94d3a60cdef4668b8b3b94bca79addd80d36bbb80847cf85099d
MD5 02d90910e45c4713c1d481b232177e0c
BLAKE2b-256 b1b151380dc56ff3e7ce112706341796a3bd700b86b7a5dff49d52a116e88a11

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 307282aff93e599f7a1de0e5167e3f74961664f1fb25ddef901253847aa11388
MD5 e1e1aae68f436afb544e65266de7e2cb
BLAKE2b-256 8729d8d4cc6b165f5e87e21af9fcde59531424d6e2e338260437cb24b95922fd

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp36-cp36m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 e6453644ce717cc58a2b454445d273c58fbb1819d1a6037704cd357232ab6718
MD5 378f0d1b9eb3112a2d9b1f19f22ad5ea
BLAKE2b-256 8687f1aba1633f5886638d87c8cd2de4e931a3154979de35f6737c3951ef5747

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp35-cp35m-win_amd64.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 5fb59327a246fea0e5045808e36e9f150b53d32eca26d519c5ef4bbb53ad097a
MD5 3d64249754cb497325ab30a1487730b8
BLAKE2b-256 2d11a437d91690ad0e9c8b7d6fcca1a823f8cfd3d03b275c2cf1683d4bde1269

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp35-cp35m-win32.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 e8e67b569eff6c932324293c448b7f066daa1c12c98e50f82dbf2abbbde3cff6
MD5 d21bb518f5b872ca42cf396031627820
BLAKE2b-256 d8d284f0e40219e772da4ecca4bf700c15822a8aa09e809fc19d3570ece77474

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9034d9a578abb620432ab65e0e831471cd064bd1039200a1842ab6180471e7fc
MD5 128c6c1e677fa12a5d6affa0cfe9e09c
BLAKE2b-256 189f34806d8a15e20e7ee73d9ae53cef40760f575923c6531d4691b35af3ef80

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp35-cp35m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 20299d48ef4d46d3240ab90802e53680ba2ffe3d4bf836f8b66d66123f620996
MD5 f46a8911b216d8689cf2cd62e4d33a18
BLAKE2b-256 781e10a4e34a9b940e0a8690d26206ab6bd89f00da1352706a57186aa29fa5e0

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp34-cp34m-win_amd64.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 8af683211d4fb2987bc98d79376e2dac824c59a5d1aedcda70c63a801e3bdec9
MD5 33b369dc4894e53ffea7e3f4341ac1fb
BLAKE2b-256 a3f22077615f05af614cb1b7b2d77ee51c3e9f9ccd2d6329f3d6670b3b2e508c

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp34-cp34m-win32.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 a2969d891a95ca684e5901741c1372fb73344ae22428fd1ac404babe656c7d51
MD5 b3a9ecde81bb09d4ce67352c6534c4a0
BLAKE2b-256 f843e23bfadd4fe8107c9c26b41ad5d52d7dd494d366985920269c48af7cd104

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp34-cp34m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 fa5b06383c039d8a765f2043631821327ab36facf442d123ecf186e42f6fadbb
MD5 e978d74b832b2fb882202ed9995cd5bf
BLAKE2b-256 74418d371cb7c9a367c203dae4cdff8557c75bc073af638848842811818980bd

See more details on using hashes here.

File details

Details for the file aiohttp-2.2.2-cp34-cp34m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for aiohttp-2.2.2-cp34-cp34m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 d3d5584a69788f18a948434e75ede64fcc383ce7bdf3712255056482c41d3989
MD5 6f0c896e34552d0a29fb76f54ff4c690
BLAKE2b-256 ae51867bc01048702be387c0d4d534da261dde9625e9f5fb4b24fccfd63268d1

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