skip to navigation
skip to content

aiohttp 0.22.0a0

http client/server for asyncio

Package Documentation

http client/server for asyncio


  • 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


To retrieve something from the web:

import aiohttp
import asyncio

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

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    with aiohttp.ClientSession(loop=loop) as session:
        html = loop.run_until_complete(
            fetch(session, ''))


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(body=text.encode('utf-8'))

async def wshandler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    async for msg in ws:
        if == web.MsgType.text:
            ws.send_str("Hello, {}".format(
        elif == web.MsgType.binary:
        elif == web.MsgType.close:

    return ws

app = web.Application()
app.router.add_route('GET', '/echo', wshandler)
app.router.add_route('GET', '/{name}', handle)


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()

shoud be replaced by:

def coro(...):
    ret = yield from f()

Discussion list

aio-libs google group:!forum/aio-libs


Optionally you may install cChardet library:


aiohttp is offered under the Apache 2 license.

Source code

The latest developer version is available in a github repository:


If you are interested in by efficiency, AsyncIO community maintains a list of benchmarks on the official wiki:


0.22.0 (XX-XX-XXXX)

  • Fix bug in serving static directory #803
  • Fix command line arg parsing #797
  • Fix a documentation chapter about cookie usage #790
  • Handle empty body with gzipped encoding #758
  • Support 451 Unavailable For Legal Reasons http status #697
  • Fix Cookie share example and few small typos in docs #817
  • UrlDispatcher.add_route with partial coroutine handler #814
  • Optional support for aiodns #728
  • Add ServiceRestart and TryAgainLater websocket close codes #828
  • Fix prompt message for web.run_app #832
  • Allow to pass None as a timeout value to disable timeout logic #834

0.21.6 (05-05-2016)

  • Drop initial query parameters on redirects #853

0.21.5 (03-22-2016)

  • Fix command line arg parsing #797

0.21.4 (03-12-2016)

  • Fix ResourceAdapter: dont add method to allowed if resource is not match #826
  • Fix Resouce: append found method to returned allowed methods

0.21.2 (02-16-2016)

  • Fix a regression: support for handling ~/path in static file routes was broken #782

0.21.1 (02-10-2016)

  • Make new resources classes public #767
  • Add router.resources() view
  • Fix cmd-line parameter names in doc

0.21.0 (02-04-2016)

  • Introduce on_shutdown signal #722

  • Implement raw input headers #726

  • Implement web.run_app utility function #734

  • Introduce on_cleanup signal

  • Deprecate Application.finish() / Application.register_on_finish() in favor of on_cleanup.

  • Get rid of bare aiohttp.request(), aiohttp.get() and family in docs #729

  • Deprecate bare aiohttp.request(), aiohttp.get() and family #729

  • Refactor keep-alive support #737:

    • Enable keepalive for HTTP 1.0 by default

    • Disable it for HTTP 0.9 (who cares about 0.9, BTW?)

    • For keepalived connections

      • Send Connection: keep-alive for HTTP 1.0 only
      • don’t send Connection header for HTTP 1.1
    • For non-keepalived connections

      • Send Connection: close for HTTP 1.1 only
      • don’t send Connection header for HTTP 1.0
  • Add version parameter to ClientSession constructor, deprecate it for session.request() and family #736

  • Enable access log by default #735

  • Deprecate app.router.register_route() (the method was not documented intentionally BTW).

  • Deprecate app.router.named_routes() in favor of app.router.named_resources()

  • route.add_static accepts pathlib.Path now #743

  • Add command line support: $ python -m aiohttp.web package.main #740

  • FAQ section was added to docs. Enjoy and fill free to contribute new topics

  • Add async context manager support to ClientSession

  • Document ClientResponse’s host, method, url properties

  • Use CORK/NODELAY in client API #748

  • ClientSession.close and Connector.close are coroutines now

  • Close client connection on exception in ClientResponse.release()

  • Allow to read multipart parts without content-length specified #750

  • Add support for unix domain sockets to gunicorn worker #470

  • Add test for default Expect handler #601

  • Add the first demo project

  • Rename loader keyword argument in web.Request.json method. #646

  • Add local socket binding for TCPConnector #678

File Type Py Version Uploaded on Size
aiohttp-0.22.0a0-cp34-cp34m-win32.whl (md5) Python Wheel cp34 2016-05-05 117KB
aiohttp-0.22.0a0-cp34-cp34m-win_amd64.whl (md5) Python Wheel cp34 2016-05-05 118KB
aiohttp-0.22.0a0-cp35-cp35m-win32.whl (md5) Python Wheel cp35 2016-05-05 119KB
aiohttp-0.22.0a0-cp35-cp35m-win_amd64.whl (md5) Python Wheel cp35 2016-05-05 120KB
aiohttp-0.22.0a0.tar.gz (md5) Source 2016-05-05 441KB