http client/server for asyncio
Project Description
http client/server for asyncio
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.
Getting started
Client
To retrieve something from the web:
import aiohttp import asyncio async def fetch(session, url, *, loop): with aiohttp.Timeout(10, loop=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, 'http://python.org', loop=loop) print(html) if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main(loop))
Server
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(body=text.encode('utf-8')) 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(msg.data)) elif msg.type == web.MsgType.binary: ws.send_bytes(msg.data) elif msg.type == web.MsgType.close: break return ws app = web.Application() app.router.add_get('/echo', wshandler) app.router.add_get('/{name}', handle) web.run_app(app)
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:
@asyncio.coroutine def coro(...): ret = yield from f()
Documentation
Discussion list
aio-libs google group: https://groups.google.com/forum/#!forum/aio-libs
Requirements
Optionally you may install the cChardet and aiodns libraries (highly recommended for sake of speed).
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
Benchmarks
If you are interested in by efficiency, AsyncIO community maintains a list of benchmarks on the official wiki: https://github.com/python/asyncio/wiki/Benchmarks
CHANGES
1.0.1 (2016-09-16)
- Restore
aiohttp.web.MsgType
alias foraiohttp.WSMsgType
for sake of backward compatibility #1178 - Tune alabaster schema.
- Use
text/html
content type for displaying index pages by static file handler. - Fix
AssertionError
in static file handling #1177 - Fix access log formats
%O
and%b
for static file handling
1.0.0 (2016-09-16)
- Change default size for client session’s connection pool from unlimited to 20 #977
- Add IE support for cookie deletion. #994
- Remove deprecated
WebSocketResponse.wait_closed
method (BACKWARD INCOMPATIBLE) - Remove deprecated
force
parameter forClientResponse.close
method (BACKWARD INCOMPATIBLE) - Avoid using of mutable CIMultiDict kw param in make_mocked_request #997
- Make WebSocketResponse.close a little bit faster by avoiding new task creating just for timeout measurement
- Add
proxy
andproxy_auth
params toclient.get()
and family, deprecateProxyConnector
#998 - Add support for websocket send_json and receive_json, synchronize server and client API for websockets #984
- Implement router shourtcuts for most useful HTTP methods, use
app.router.add_get()
,app.router.add_post()
etc. instead ofapp.router.add_route()
#986 - Support SSL connections for gunicorn worker #1003
- Move obsolete examples to legacy folder
- Switch to multidict 2.0 and title-cased strings #1015
{FOO}e
logger format is case-sensitive now- Fix logger report for unix socket 8e8469b
- Rename aiohttp.websocket to aiohttp._ws_impl
- Rename aiohttp.MsgType tp aiohttp.WSMsgType
- Introduce aiohttp.WSMessage officially
- Rename Message -> WSMessage
- Remove deprecated decode param from resp.read(decode=True)
- Use 5min default client timeout #1028
- Relax HTTP method validation in UrlDispatcher #1037
- Pin minimal supported asyncio version to 3.4.2+ (
loop.is_close()
should be present) - Remove aiohttp.websocket module (BACKWARD IMCOMPATIBLE) Please use high-level client and server approaches
- Link header for 451 status code is mandatory
- Fix test_client fixture to allow multiple clients per test #1072
- make_mocked_request now accepts dict as headers #1073
- Add Python 3.5.2/3.6+ compatibility patch for async generator protocol change #1082
- Improvement test_client can accept instance object #1083
- Simplify ServerHttpProtocol implementation #1060
- Add a flag for optional showing directory index for static file handling #921
- Define
web.Application.on_startup()
signal handler #1103 - Drop ChunkedParser and LinesParser #1111
- Call
Application.startup
in GunicornWebWorker #1105 - Fix client handling hostnames with 63 bytes when a port is given in the url #1044
- Implement proxy support for ClientSession.ws_connect #1025
- Return named tuple from WebSocketResponse.can_prepare #1016
- Fix access_log_format in
GunicornWebWorker
#1117 - Setup Content-Type to application/octet-stream by default #1124
- Deprecate debug parameter from app.make_handler(), use
Application(debug=True)
instead #1121 - Remove fragment string in request path #846
- Use aiodns.DNSResolver.gethostbyname() if available #1136
- Fix static file sending on uvloop when sendfile is available #1093
- Make prettier urls if query is empty dict #1143
- Fix redirects for HEAD requests #1147
- Default value for
StreamReader.read_nowait
is -1 from now #1150 aiohttp.StreamReader
is not inherited fromasyncio.StreamReader
from now (BACKWARD INCOMPATIBLE) #1150- Streams documentation added #1150
- Add
multipart
coroutine method for web Request object #1067 - Publish ClientSession.loop property #1149
- Fix static file with spaces #1140
- Fix piling up asyncio loop by cookie expiration callbacks #1061
- Drop
Timeout
class for sake ofasync_timeout
external library.aiohttp.Timeout
is an alias forasync_timeout.timeout
use_dns_cache
parameter ofaiohttp.TCPConnector
isTrue
by default (BACKWARD INCOMPATIBLE) #1152aiohttp.TCPConnector
uses asynchronous DNS resolver if available by default (BACKWARD INCOMPATIBLE) #1152- Conform to RFC3986 - do not include url fragments in client requests #1174
- Drop
ClientSession.cookies
(BACKWARD INCOMPATIBLE) #1173 - Refactor
AbstractCookieJar
public API (BACKWARD INCOMPATIBLE) #1173 - Fix clashing cookies with have the same name but belong to different domains (BACKWARD INCOMPATIBLE) #1125
- Support binary Content-Transfer-Encoding #1169
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.0.1-cp34-cp34m-manylinux1_i686.whl (147.7 kB) Copy SHA256 hash SHA256 | Wheel | cp34 | Sep 16, 2016 |
aiohttp-1.0.1-cp34-cp34m-manylinux1_x86_64.whl (150.4 kB) Copy SHA256 hash SHA256 | Wheel | cp34 | Sep 16, 2016 |
aiohttp-1.0.1-cp34-cp34m-win32.whl (131.0 kB) Copy SHA256 hash SHA256 | Wheel | cp34 | Sep 16, 2016 |
aiohttp-1.0.1-cp34-cp34m-win_amd64.whl (131.3 kB) Copy SHA256 hash SHA256 | Wheel | cp34 | Sep 16, 2016 |
aiohttp-1.0.1-cp35-cp35m-manylinux1_i686.whl (147.6 kB) Copy SHA256 hash SHA256 | Wheel | cp35 | Sep 16, 2016 |
aiohttp-1.0.1-cp35-cp35m-manylinux1_x86_64.whl (150.3 kB) Copy SHA256 hash SHA256 | Wheel | cp35 | Sep 16, 2016 |
aiohttp-1.0.1-cp35-cp35m-win32.whl (132.2 kB) Copy SHA256 hash SHA256 | Wheel | cp35 | Sep 16, 2016 |
aiohttp-1.0.1-cp35-cp35m-win_amd64.whl (133.4 kB) Copy SHA256 hash SHA256 | Wheel | cp35 | Sep 16, 2016 |
aiohttp-1.0.1.tar.gz (499.0 kB) Copy SHA256 hash SHA256 | Source | None | Sep 16, 2016 |