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

This version

2.2.5

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.5.tar.gz (788.6 kB view details)

Uploaded Source

Built Distributions

aiohttp-2.2.5-cp36-cp36m-win_amd64.whl (320.2 kB view details)

Uploaded CPython 3.6m Windows x86-64

aiohttp-2.2.5-cp36-cp36m-win32.whl (311.4 kB view details)

Uploaded CPython 3.6m Windows x86

aiohttp-2.2.5-cp36-cp36m-manylinux1_x86_64.whl (770.8 kB view details)

Uploaded CPython 3.6m

aiohttp-2.2.5-cp36-cp36m-manylinux1_i686.whl (749.2 kB view details)

Uploaded CPython 3.6m

aiohttp-2.2.5-cp35-cp35m-win_amd64.whl (318.6 kB view details)

Uploaded CPython 3.5m Windows x86-64

aiohttp-2.2.5-cp35-cp35m-win32.whl (309.9 kB view details)

Uploaded CPython 3.5m Windows x86

aiohttp-2.2.5-cp35-cp35m-manylinux1_x86_64.whl (759.1 kB view details)

Uploaded CPython 3.5m

aiohttp-2.2.5-cp35-cp35m-manylinux1_i686.whl (736.0 kB view details)

Uploaded CPython 3.5m

aiohttp-2.2.5-cp34-cp34m-win_amd64.whl (314.1 kB view details)

Uploaded CPython 3.4m Windows x86-64

aiohttp-2.2.5-cp34-cp34m-win32.whl (308.7 kB view details)

Uploaded CPython 3.4m Windows x86

aiohttp-2.2.5-cp34-cp34m-manylinux1_x86_64.whl (559.6 kB view details)

Uploaded CPython 3.4m

aiohttp-2.2.5-cp34-cp34m-manylinux1_i686.whl (535.6 kB view details)

Uploaded CPython 3.4m

File details

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

File metadata

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

File hashes

Hashes for aiohttp-2.2.5.tar.gz
Algorithm Hash digest
SHA256 af5bfdd164256118a0a306b3f7046e63207d1f8cba73a67dcc0bd858dcfcd3bc
MD5 d684d09550074b3c4a93dc1862ac5170
BLAKE2b-256 1ed4c1206b016b42a0b223aadb559318966b64ec27e5406bed79c36356e62082

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 d15c6658de5b7783c2538407278fa062b079a46d5f814a133ae0f09bbb2cfbc4
MD5 951a7007bd932f3b0dcc7801ec97c4b0
BLAKE2b-256 3205c3cd2cc3a38547ea81697cd46c9b504dfe1b4e693187006c930cc7b6dc95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 129d83dd067760cec3cfd4456b5c6d7ac29f2c639d856884568fd539bed5a51f
MD5 407fd2045eae4e58d6ba9b9e8c40fc55
BLAKE2b-256 e727746878e6d378cd8477c091f27629cc49143e271fd376adc547978d694301

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c67e105ec74b85c8cb666b6877569dee6f55b9548f982983b9bee80b3d47e6f3
MD5 a262e673c0e1ad71f36a99c33a6249ac
BLAKE2b-256 660e93b5655b21b769aa202b2f2d1bfce126eb0d16553522e0e9b3aa9cd2ea99

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 d611ebd1ef48498210b65486306e065fde031040a1f3c455ca1b6baa7bf32ad3
MD5 ceb9f110b1016f47cf9bd16abaa805df
BLAKE2b-256 cd9528e629e5202a2b6a8bc9183bab40b001a17712529db46ed50f10f357e16c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 666756e1d4cf161ed1486b82f65fdd386ac07dd20fb10f025abf4be54be12746
MD5 0ee37fbaca1504b7b5abecbea2284b02
BLAKE2b-256 05bee3e5e24339e6b8e02d636b4d89a37095e387bcc71fed990a9079177ed0b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 eb6f1405b607fff7e44168e3ceb5d3c8a8c5a2d3effe0a27f843b16ec047a6d7
MD5 d7aaa6954441f6c1685bc8c45b98790d
BLAKE2b-256 53c5ceddfb96f4e7cc94147e246fdbfbefd1abab57eb38f35b2082d2cb1d8eaa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b80f44b99fa3c9b4530fcfa324a99b84843043c35b084e0b653566049974435d
MD5 8e6769ec793a0c34073b946b44ac06a9
BLAKE2b-256 dd48308b5f6d3e38e49ceb84c41e1823992e1494ab034bd07caee0d159ae8010

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 dcc7e4dcec6b0012537b9f8a0726f8b111188894ab0f924b680d40b13d3298a0
MD5 28480565a23cd847e5ae07ebbc73f200
BLAKE2b-256 dcfc3fc36f9062ee6af43b265f6c40c2901a8f4163463a5bcf2c4a5998a78f27

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 33c62afd115c456b0cf1e890fe6753055effe0f31a28321efd4f787378d6f4ab
MD5 150a465f78c85b673d8cfcb2c41373f4
BLAKE2b-256 853fefac030a5e89c0edeb3c7840bb95eb4ddfe2d9fa50fe24fad43d93811a3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 f0e2ac69cb709367400008cebccd5d48161dd146096a009a632a132babe5714c
MD5 8d673bf8bec7206dd042a1c0d631ee8e
BLAKE2b-256 2ccf03760d31e1605dd89c91b7336adb553a97d587563d344e148f2ff150eeaf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 de8ef106e130b94ca143fdfc6f27cda1d8ba439462542377738af4d99d9f5dd2
MD5 825735ed55f584ad1924be0a098293c3
BLAKE2b-256 6fa370986a7ca4d15365a1b6421c449b622f396db33823ca34225da0913818bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.5-cp34-cp34m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 9705ded5a0faa25c8f14c6afb7044002d66c9120ed7eadb4aa9ca4aad32bd00c
MD5 90b2d5c038c66275fc21641fe9826204
BLAKE2b-256 84d8acaa76e5652850041c24c080cf5bbc9bf829040996cdc2df02e42199b119

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