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

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

Uploaded Source

Built Distributions

aiohttp-2.2.1-cp36-cp36m-win_amd64.whl (319.8 kB view details)

Uploaded CPython 3.6m Windows x86-64

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

Uploaded CPython 3.6m Windows x86

aiohttp-2.2.1-cp36-cp36m-manylinux1_x86_64.whl (770.4 kB view details)

Uploaded CPython 3.6m

aiohttp-2.2.1-cp36-cp36m-manylinux1_i686.whl (748.8 kB view details)

Uploaded CPython 3.6m

aiohttp-2.2.1-cp35-cp35m-win_amd64.whl (318.2 kB view details)

Uploaded CPython 3.5m Windows x86-64

aiohttp-2.2.1-cp35-cp35m-win32.whl (309.5 kB view details)

Uploaded CPython 3.5m Windows x86

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

Uploaded CPython 3.5m

aiohttp-2.2.1-cp35-cp35m-manylinux1_i686.whl (735.6 kB view details)

Uploaded CPython 3.5m

aiohttp-2.2.1-cp34-cp34m-win_amd64.whl (313.7 kB view details)

Uploaded CPython 3.4m Windows x86-64

aiohttp-2.2.1-cp34-cp34m-win32.whl (308.4 kB view details)

Uploaded CPython 3.4m Windows x86

aiohttp-2.2.1-cp34-cp34m-manylinux1_x86_64.whl (559.2 kB view details)

Uploaded CPython 3.4m

aiohttp-2.2.1-cp34-cp34m-manylinux1_i686.whl (535.3 kB view details)

Uploaded CPython 3.4m

File details

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

File metadata

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

File hashes

Hashes for aiohttp-2.2.1.tar.gz
Algorithm Hash digest
SHA256 9470050ec764ae19a9f1d19cc91d61d7aa7097daa1d919216530d01f31602158
MD5 3715f4807018fafa0e34a80128341e27
BLAKE2b-256 03d6ac965bfde0a2b334cdccaea93df0888ef9484c402a85a6117052552faf2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 19146b5c1e88462a8dbd5b1e74c7606a28ad1fed6fd6e63d1fae38b75a2061cb
MD5 9a445a4d797fc67381ee0e69c9a5274c
BLAKE2b-256 f6c843cf17b295db321159dabbb96e0eaa601eb68fe7278e2de3ce9a832ec15a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 490367b98782e10005ca35963ed16031afede94eec7e42184f0db75430cc8936
MD5 9bcfc9c1c0e1d10e1d9456e62ddf4e68
BLAKE2b-256 46de47ffe56f3147a6e9e424a229eb5818aca20dcac956dfa062a5659dda2d5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9211d8523520fd7764cf0fd071cc3b59466b4a51d75e60ca0eacbd7b2c299f65
MD5 f400aaa30d62fe584805830a60e85541
BLAKE2b-256 72ff2eb29a16fec66964816d62d010e1310940116bd6bcd4de5b1de1570739d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 17745a44ffb68a6c994117b09fedaaa22c6474a68aa963a7f369383ef64b7dd1
MD5 fbe5f8105ea4c100696ec327aa2e501a
BLAKE2b-256 ec54c391da7c17a45b4df90ad3a30876c71746751f86cf444394ebeac0ac7e3a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 2186f98b4082449d51b4de7210e46cb5902d12bef2ce478e3773dce8ab5ad060
MD5 9de8a9994efdf5f07b4cd8da92c5dd6e
BLAKE2b-256 4a489b3259df0f5ad513a845f817a926974b7d0f10c9bf6147626ded893a9e8d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 91a78083256e455b2344a86fb0219839397d4584dbc27846dc0aacaab3f50cbe
MD5 3edd5cdfc4bdf1db7866244d1c44c12e
BLAKE2b-256 c86624ca3b6287bebba47fe1d7e492f8386e14f86e8bf5f12a5bcbc41b7576a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2ed468c8aedf32a67036d00210eca9431e99cb6cd093fc39c4f8dc960bd755e9
MD5 76a084bf69340d129f9e622cd401b2ef
BLAKE2b-256 5495446abee8a32d82ccda7919ae439d3daa063f7609c6947cd3705116361e22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 662f831b5065c5b9f14da08139aa543004776243e4a3e2e79c3c802e7836c2dd
MD5 96d16b665583cf4e9af2d90d766765f6
BLAKE2b-256 46141a6cf317e8981a50898e7a272181f83071375b9998ba242ad13f39b9455b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 cfe99f629e84d5bdd6372c5ee1451d8ecba9c44ea470d730e50a754406b08a63
MD5 5ae762934c516a85e4792ef7e03b490f
BLAKE2b-256 1541593fa01dd61fe7dbffe38eb66dc0e68753b2b220185beb6b06018e90e8d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 bb4b04cd7e87e70417f805957e12aece352af346760faa5b21384a4dd1d34509
MD5 9e7c31fcbf54b140e7f508e372bcc921
BLAKE2b-256 61fa359731c63e26b1ffe53b15e6923887f77664aac0ebe3c644679da2eff6c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 8de0485e52a86171421d6655e17c73690dd7e4e282d4cd0c41c889e62f1afb9e
MD5 b09b1658cf7b7c2b831ee0cec357e349
BLAKE2b-256 84c0e4c7f005b1b133f8488b63177a6cd4015d68666358e1cef87691bd929440

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for aiohttp-2.2.1-cp34-cp34m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 0640fd4350343728c2edd1ec5e03e0d1ca17e239b91e09d7fb320ff802fa4b6a
MD5 5f0fefbc0300dee5cd9997b3b763e437
BLAKE2b-256 9092a8d6021aeb69f5a9e11d3a41bbe60dbd1fd0e87df736be53645da458943b

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