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


The aiohttp community would like to thank Keepsafe ( for it’s support in the early days of the project.

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.3.4 (2017-03-14)

  • Revert timeout handling in client request
  • Fix StreamResponse representation after eof
  • Fix file_sender to not fall on bad request (range out of file size)
  • Fix file_sender to correct stream video to Chromes
  • Fix NotImplementedError server exception #1703
  • Clearer error message for URL without a host name. #1691
  • Silence deprecation warning in __repr__ #1690
  • IDN + HTTPS = ssl.CertificateError #1685

1.3.3 (2017-02-19)

  • Fixed memory leak in time service #1656

1.3.2 (2017-02-16)

  • Awaiting on WebSocketResponse.send_* does not work #1645
  • Fix multiple calls to client ws_connect when using a shared header dict #1643
  • Make CookieJar.filter_cookies() accept plain string parameter. #1636

1.3.1 (2017-02-09)

  • Handle CLOSING in WebSocketResponse.__anext__
  • Fixed AttributeError ‘drain’ for server websocket handler #1613

1.3.0 (2017-02-08)

  • Multipart writer validates the data on append instead of on a request send #920
  • Multipart reader accepts multipart messages with or without their epilogue to consistently handle valid and legacy behaviors #1526 #1581
  • Separate read + connect + request timeouts # 1523
  • Do not swallow Upgrade header #1587
  • Fix polls demo run application #1487
  • Ignore unknown 1XX status codes in client #1353
  • Fix sub-Multipart messages missing their headers on serialization #1525
  • Do not use readline when reading the content of a part in the multipart reader #1535
  • Add optional flag for quoting FormData fields #916
  • 416 Range Not Satisfiable if requested range end > file size #1588
  • Having a : or @ in a route does not work #1552
  • Added receive_timeout timeout for websocket to receive complete message. #1325
  • Added heartbeat parameter for websocket to automatically send ping message. #1024 #777
  • Remove web.Application dependency from web.UrlDispatcher #1510
  • Accepting back-pressure from slow websocket clients #1367
  • Do not pause transport during set_parser stage #1211
  • Lingering close doesn’t terminate before timeout #1559
  • setsockopt may raise OSError exception if socket is closed already #1595
  • Lots of CancelledError when requests are interrupted #1565
  • Allow users to specify what should happen to decoding errors when calling a responses text() method #1542
  • Back port std module http.cookies for python3.4.2 #1566
  • Maintain url’s fragment in client response #1314
  • Allow concurrently close WebSocket connection #754
  • Gzipped responses with empty body raises ContentEncodingError #609
  • Return 504 if request handle raises TimeoutError.
  • Refactor how we use keep-alive and close lingering timeouts.
  • Close response connection if we can not consume whole http message during client response release
  • Abort closed ssl client transports, broken servers can keep socket open un-limit time #1568
  • Log warning instead of RuntimeError is websocket connection is closed.
  • Deprecated: aiohttp.protocol.HttpPrefixParser will be removed in 1.4 #1590
  • Deprecated: Servers response’s .started, .start() and .can_start() method will be removed in 1.4 #1591
  • Deprecated: Adding sub app via app.router.add_subapp() is deprecated use app.add_subapp() instead, will be removed in 1.4 #1592
  • Deprecated: aiohttp.get(), aiohttp.options(), aiohttp.head(),, aiohttp.put(), aiohttp.patch(), aiohttp.delete(), and aiohttp.ws_connect() will be removed in 1.4 #1593
  • Deprecated: Application.finish() and Application.register_on_finish() will be removed in 1.4 #1602

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.

Files for aiohttp, version 1.3.4
Filename, size File type Python version Upload date Hashes
Filename, size aiohttp-1.3.4-cp34-cp34m-manylinux1_i686.whl (165.6 kB) File type Wheel Python version cp34 Upload date Hashes View
Filename, size aiohttp-1.3.4-cp34-cp34m-manylinux1_x86_64.whl (168.3 kB) File type Wheel Python version cp34 Upload date Hashes View
Filename, size aiohttp-1.3.4-cp35-cp35m-manylinux1_i686.whl (165.5 kB) File type Wheel Python version cp35 Upload date Hashes View
Filename, size aiohttp-1.3.4-cp35-cp35m-manylinux1_x86_64.whl (168.2 kB) File type Wheel Python version cp35 Upload date Hashes View
Filename, size aiohttp-1.3.4-cp36-cp36m-manylinux1_i686.whl (165.7 kB) File type Wheel Python version cp36 Upload date Hashes View
Filename, size aiohttp-1.3.4-cp36-cp36m-manylinux1_x86_64.whl (168.3 kB) File type Wheel Python version cp36 Upload date Hashes View
Filename, size aiohttp-1.3.4.tar.gz (527.3 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring DigiCert DigiCert EV certificate Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page