Skip to main content

http client/server for asyncio

Project description

http client/server for asyncio

aiohttp logo https://secure.travis-ci.org/KeepSafe/aiohttp.png

Features

  • 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.

Requirements

License

aiohttp is offered under the Apache 2 license.

Source code

The latest developer version is available in a github repository: https://github.com/KeepSafe/aiohttp

Getting started

Client

To retrieve something from the web:

import aiohttp
import asyncio

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

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    raw_html = loop.run_until_complete(get_body('http://python.org'))
    print(raw_html)

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

response = yield from aiohttp.request('GET', 'http://python.org')
body = yield from response.read()
print(body)

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

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

Server

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

This is simple usage example:

import asyncio
from aiohttp import web


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


@asyncio.coroutine
def wshandler(request):
    ws = web.WebSocketResponse()
    ws.start(request)

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

        if msg.tp == web.MsgType.text:
            ws.send_str("Hello, {}".format(msg.data))
        elif msg.tp == web.MsgType.binary:
            ws.send_bytes(msg.data)
        elif msg.tp == web.MsgType.close:
            break

    return ws


@asyncio.coroutine
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(), '127.0.0.1', 8080)
    print("Server started at http://127.0.0.1:8080")
    return srv

loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()

CHANGES

0.16.4 (06-13-2015)

  • Don’t clear current exception in multidict’s __repr__ (cythonized versions) #410

0.16.3 (05-30-2015)

  • Fix StaticRoute vulnerability to directory traversal attacks #380

0.16.2 (05-27-2015)

  • Update python version required for __del__ usage: it’s actially
    3.4.1 instead of 3.4.0
  • Add check for presence of loop.is_closed() method before call the former #378

0.16.1 (05-27-2015)

  • Fix regression in static file handling #377

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

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-0.16.4.tar.gz (1.6 MB) 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