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.



aiohttp is offered under the Apache 2 license.


Source code

The latest developer version is available in a github repository:

Getting started


To retrieve something from the web:

import aiohttp
import asyncio

def get_body(url):
    response = yield from aiohttp.request('GET', url)
    return (yield from

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

You can use the get command like this anywhere in your asyncio powered program:

response = yield from aiohttp.request('GET', '')
body = yield from

If you want to use timeouts for aiohttp client side please use standard asyncio approach:

yield from asyncio.wait_for(request('GET', url), 10)


In aiohttp 0.12 we’ve added highlevel API for web HTTP server.

This is simple usage example:

import asyncio
from aiohttp import web

def handle(request):
    name = request.match_info.get('name', "Anonymous")
    text = "Hello, " + name
    return web.Response(body=text.encode('utf-8'))

def wshandler(request):
    ws = web.WebSocketResponse()

    while True:
        msg = yield from ws.receive()

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

    return ws

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

    srv = yield from loop.create_server(app.make_handler(), '', 8080)
    print("Server started at")
    return srv

loop = asyncio.get_event_loop()


0.16.0 (05-26-2015)

  • Unset waiter future after cancellation #363

  • Update request url with query parameters #372

  • Support new fingerprint param of TCPConnector to enable verifying ssl certificates via md5, sha1, or sha256 digest #366

  • Setup uploaded filename if field value is binary and transfer encoding is not specified #349

  • Implement ClientSession.close() method

  • Implement connector.closed readonly property

  • Implement ClientSession.closed readonly property

  • Implement ClientSession.connector readonly property

  • Implement ClientSession.detach method

  • Add __del__ to client-side objects: sessions, connectors, connections, requests, responses.

  • Refactor connections cleanup by connector #357

  • Add limit parameter to connector constructor #358

  • Add request.has_body property #364

  • Add response_class parameter to ws_connect() #367

  • ProxyConnector doesn’t support keep-alive requests by default starting from now #368

  • Add connector.force_close property

  • Add ws_connect to ClientSession #374

  • Support optional chunk_size parameter in router.add_static()

0.15.3 (04-22-2015)

  • Fix graceful shutdown handling

  • Fix Expect header handling for not found and not allowed routes #340

0.15.2 (04-19-2015)

  • Flow control subsystem refactoring

  • Http server performace optimizations

  • Allow to match any request method with *

  • Explicitly call drain on transport #316

  • Make chardet module dependency mandatory #318

  • Support keep-alive for HTTP 1.0 #325

  • Do not chunk single file during upload #327

  • Add ClientSession object for cookie storage and default headers #328

  • Add keep_alive_on argument for http server handler.

0.15.1 (03-31-2015)

  • Pass Autobahn Testsuit tests

  • Fixed websocket fragmentation

  • Fixed websocket close procedure

  • Fixed parser buffer limits

  • Added timeout parameter to WebSocketResponse ctor

  • Added WebSocketResponse.close_code attribute

0.15.0 (03-27-2015)

  • Client WebSockets support

  • New Multipart system #273

  • Support for “Except” header #287 #267

  • Set default Content-Type for post requests #184

  • Fix issue with construction dynamic route with regexps and trailing slash #266

  • Add repr to web.Request

  • Add repr to web.Response

  • Add repr for NotFound and NotAllowed match infos

  • Add repr for web.Application

  • Add repr to UrlMappingMatchInfo #217

  • Gunicorn 19.2.x compatibility

Project details

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.

Source Distribution

aiohttp-0.16.0.tar.gz (476.2 kB view hashes)

Uploaded Source

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