Skip to main content

http client/server for asyncio

Project description

http client/server for asyncio

aiohttp logo


  • 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

Project details

Release history Release notifications

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
aiohttp-1.2.0-cp34-cp34m-manylinux1_i686.whl (152.6 kB) Copy SHA256 hash SHA256 Wheel cp34
aiohttp-1.2.0-cp34-cp34m-manylinux1_x86_64.whl (155.3 kB) Copy SHA256 hash SHA256 Wheel cp34
aiohttp-1.2.0-cp34-cp34m-win32.whl (135.9 kB) Copy SHA256 hash SHA256 Wheel cp34
aiohttp-1.2.0-cp34-cp34m-win_amd64.whl (136.2 kB) Copy SHA256 hash SHA256 Wheel cp34
aiohttp-1.2.0-cp35-cp35m-manylinux1_i686.whl (152.5 kB) Copy SHA256 hash SHA256 Wheel cp35
aiohttp-1.2.0-cp35-cp35m-manylinux1_x86_64.whl (155.2 kB) Copy SHA256 hash SHA256 Wheel cp35
aiohttp-1.2.0-cp35-cp35m-win32.whl (137.1 kB) Copy SHA256 hash SHA256 Wheel cp35
aiohttp-1.2.0-cp35-cp35m-win_amd64.whl (138.3 kB) Copy SHA256 hash SHA256 Wheel cp35
aiohttp-1.2.0.tar.gz (519.2 kB) Copy SHA256 hash SHA256 Source None

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page