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

aiohttp-2.2.0.tar.gz (782.0 kB view details)

Uploaded Source

Built Distributions

aiohttp-2.2.0-cp36-cp36m-win_amd64.whl (319.7 kB view details)

Uploaded CPython 3.6m Windows x86-64

aiohttp-2.2.0-cp36-cp36m-win32.whl (311.0 kB view details)

Uploaded CPython 3.6m Windows x86

aiohttp-2.2.0-cp36-cp36m-manylinux1_x86_64.whl (770.3 kB view details)

Uploaded CPython 3.6m

aiohttp-2.2.0-cp36-cp36m-manylinux1_i686.whl (748.7 kB view details)

Uploaded CPython 3.6m

aiohttp-2.2.0-cp35-cp35m-win_amd64.whl (318.1 kB view details)

Uploaded CPython 3.5m Windows x86-64

aiohttp-2.2.0-cp35-cp35m-win32.whl (309.4 kB view details)

Uploaded CPython 3.5m Windows x86

aiohttp-2.2.0-cp35-cp35m-manylinux1_x86_64.whl (758.6 kB view details)

Uploaded CPython 3.5m

aiohttp-2.2.0-cp35-cp35m-manylinux1_i686.whl (735.5 kB view details)

Uploaded CPython 3.5m

aiohttp-2.2.0-cp34-cp34m-win_amd64.whl (313.6 kB view details)

Uploaded CPython 3.4m Windows x86-64

aiohttp-2.2.0-cp34-cp34m-win32.whl (308.3 kB view details)

Uploaded CPython 3.4m Windows x86

aiohttp-2.2.0-cp34-cp34m-manylinux1_x86_64.whl (559.1 kB view details)

Uploaded CPython 3.4m

aiohttp-2.2.0-cp34-cp34m-manylinux1_i686.whl (535.2 kB view details)

Uploaded CPython 3.4m

File details

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

File metadata

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

File hashes

Hashes for aiohttp-2.2.0.tar.gz
Algorithm Hash digest
SHA256 1558ba6896c2ed4e1b3cbdc4ba479b4a03a0c1433af2fe23704d2959a0c5191e
MD5 e50ea3d70f2d821b7e40442fb470e8ef
BLAKE2b-256 38db8cff056477179e480142c5c9ed673489f91b7e65945405bcd1449f8c2db6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 902ce0ab5b17a44fdff71edd3461229f07aa23c03412ed4d938f8d9cce4c92c4
MD5 6ac343a6480f132448822419340918b1
BLAKE2b-256 1cb6445d55221b983c28a21489a626c537810b4bfb9bd8639934571454bbcd21

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 57b00f09f7de8cde740c7f01cc62c430ce97c20949d8bf965bf8afa508a4f9b9
MD5 02ec61e8b46307bd075f3259f462c142
BLAKE2b-256 d9e5c44461bb7574feaf40dec59b8c6cee2845ff91b33caa5766bc7ae23e75a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ec2cb06d1c68ae31077f4eb043b2a2586b0d25285f9a15bae6d27c4b46c4afcc
MD5 5b1c72538840a8c766b0b4e4fef0b642
BLAKE2b-256 d6a1588eabb1d227137ffaf5de3b7ab35b603c469d45542c228abe3e70a3abd4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 5935f37db277fcc552b7ce41210175bd54589185c8908726a652090b4430efda
MD5 afc4707b74c2315fdd8ef00b74092900
BLAKE2b-256 4a81a73812ce6b84d3d3d151333e357575ba3c340df820f853ec534076c66aa4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 9984e859dc27eeb1f5a507df356ce02d96ffeccdce5ce3f7c549d87ad1709ea4
MD5 d2e338eb47cb40f0ba748c8c22dbf2d3
BLAKE2b-256 340099528c6d9af5fd7ef53eafb21732b8e32af357dec20d19900b90b2feb9ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 54f1e6c6fc86001c88013341198af77678a146201c0a9cbcf452e12f97ce8c21
MD5 8d36a95bd332aab38f937c2da461ed35
BLAKE2b-256 833b3ddadde2f3b55340315bdfeb1a7287d0cf3030e6f87010b6def4606f63c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2b19c3fc595d7a37d5445405b87ec9e9746d19c7e7b15c5d08a975bf0a1cbaf8
MD5 c1b4d78f0874fc4a168e8ce8a2708121
BLAKE2b-256 2bb8f8331846fc582bb8c24c0425cfa32bf5d00446be080316cf2a7296fbd6e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 501a8e5dd5c30518e5babc99b2158225593b4a9c5263e648eaf4c67ff05ea2d0
MD5 30760f072b525ced98456378534e44f1
BLAKE2b-256 7a29b99c0574abd9f92632164e95d643262b8bc6319a5e78fc6b2b1143defbfe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 ac0ae873d99ca56999e5df53e3c9db7f4970ddd22b8affaa5f84fdb275720631
MD5 94d1c5d3969997873c8acd43ed338fd8
BLAKE2b-256 137f1722ce2352c7ea1754ffad8a193febd0129231b28508dae583aaba7c55a2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 2271e5d173a491304c72c63b81c00233baa8bdba6b7f3d31884aa7b5ae5331e0
MD5 ec71c19476b2422b4a633cd018377618
BLAKE2b-256 daba9f67e50a9fe0b9a0a9a8eac5cca7a794f7299deacb48e91878bf38cad4bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c39f00b8ab8fbc734a7045e0aa9b8302ffd9512dbe58be82b49cf0780d83a457
MD5 d27942db86c3b96999b78831ace03e04
BLAKE2b-256 6cd141f69670e35b703c9a0c4927197b0b73e2d2f5e863c14dea7ec71a624014

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.0-cp34-cp34m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 019daf6428df624322f6063449bf81c3971b6c77778980ef7e9a56c25aea22f3
MD5 11cf61f4e97c928aa0fccb8cad896557
BLAKE2b-256 05b5881604e573da60cc8c9674a049fea97bb0696cd240a1eca3516327e3966b

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