skip to navigation
skip to content

aiohttp 1.2.0

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, 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, '')

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


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:
            ws.send_str("Hello, {}".format(
        elif msg.type == web.MsgType.binary:
        elif msg.type == web.MsgType.close:

    return ws

app = web.Application()
app.router.add_get('/echo', wshandler)
app.router.add_get('/', handle)
app.router.add_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()

should be replaced by:

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

Discussion list

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


Optionally you may install the cChardet and aiodns libraries (highly recommended for sake of speed).


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:


1.2.0 (2016-12-17)

  • Extract BaseRequest from web.Request, introduce web.Server (former RequestHandlerFactory), introduce new low-level web server which is not coupled with web.Application and routing #1362
  • Make TestServer.make_url compatible with yarl.URL #1389
  • Implement range requests for static files #1382
  • Support task attribute for StreamResponse #1410
  • Drop property, use instead (BACKWARD INCOMPATIBLE)
  • Drop TestClient.handler property, use TestClient.server.handler instead (BACKWARD INCOMPATIBLE)
  • TestClient.server property returns a test server instance, was asyncio.AbstractServer (BACKWARD INCOMPATIBLE)
  • Follow gunicorn’s signal semantics in Gunicorn[UVLoop]WebWorker #1201
  • Call worker_int and worker_abort callbacks in Gunicorn[UVLoop]WebWorker #1202
  • Has functional tests for client proxy #1218
  • Fix bugs with client proxy target path and proxy host with port #1413
  • Fix bugs related to the use of unicode hostnames #1444
  • Preserve cookie quoting/escaping #1453
  • FileSender will send gzipped response if gzip version available #1426
  • Don’t override Content-Length header in web.Response if no body was set #1400
  • Introduce router.post_init() for solving #1373
  • Fix raise error in case of multiple calls of TimeServive.stop()
  • Allow to raise web exceptions on router resolving stage #1460
  • Add a warning for session creation outside of coroutine #1468
  • Avoid a race when application might start accepting incoming requests but startup signals are not processed yet e98e8c6
  • Raise a RuntimeError when trying to change the status of the HTTP response after the headers have been sent #1480
  • Fix bug with https proxy acquired cleanup #1340
  • Use UTF-8 as the default encoding for multipart text parts #1484
File Type Py Version Uploaded on Size
aiohttp-1.2.0-cp34-cp34m-manylinux1_i686.whl (md5) Python Wheel cp34 2016-12-17 149KB
aiohttp-1.2.0-cp34-cp34m-manylinux1_x86_64.whl (md5) Python Wheel cp34 2016-12-17 151KB
aiohttp-1.2.0-cp34-cp34m-win32.whl (md5) Python Wheel cp34 2016-12-17 132KB
aiohttp-1.2.0-cp34-cp34m-win_amd64.whl (md5) Python Wheel cp34 2016-12-17 133KB
aiohttp-1.2.0-cp35-cp35m-manylinux1_i686.whl (md5) Python Wheel cp35 2016-12-17 148KB
aiohttp-1.2.0-cp35-cp35m-manylinux1_x86_64.whl (md5) Python Wheel cp35 2016-12-17 151KB
aiohttp-1.2.0-cp35-cp35m-win32.whl (md5) Python Wheel cp35 2016-12-17 133KB
aiohttp-1.2.0-cp35-cp35m-win_amd64.whl (md5) Python Wheel cp35 2016-12-17 135KB
aiohttp-1.2.0.tar.gz (md5) Source 2016-12-17 507KB