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 get_body(client, url): async with client.get(url) as response: return await response.read() if __name__ == '__main__': loop = asyncio.get_event_loop() client = aiohttp.ClientSession(loop=loop) raw_html = loop.run_until_complete(get_body(client, 'http://python.org')) print(raw_html) client.close()
If you want to use timeouts for aiohttp client please use standard asyncio approach:
yield from asyncio.wait_for(client.get(url), 10)
Server
This is simple usage example:
import asyncio 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.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 async def init(loop): app = web.Application(loop=loop) app.router.add_route('GET', '/echo', wshandler) app.router.add_route('GET', '/{name}', handle) srv = await 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()
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()
shoud 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
- Python >= 3.4.1
- chardet https://pypi.python.org/pypi/chardet
Optionally you may install cChardet library: https://pypi.python.org/pypi/cchardet/1.0.0
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
0.20.0 (12-28-2015)
- Extend list of web exceptions, add HTTPMisdirectedRequest, HTTPUpgradeRequired, HTTPPreconditionRequired, HTTPTooManyRequests, HTTPRequestHeaderFieldsTooLarge, HTTPVariantAlsoNegotiates, HTTPNotExtended, HTTPNetworkAuthenticationRequired status codes #644
- Do not remove AUTHORIZATION header by WSGI handler #649
- Fix broken support for https proxies with authentication #617
- Get REMOTE_* and SEVER_* http vars from headers when listening on unix socket #654
- Add HTTP 308 support #663
- Add Tf format (time to serve request in seconds, %06f format) to access log #669
- Remove one and a half years long deprecated ClientResponse.read_and_close() method
- Optimize chunked encoding: use a single syscall instead of 3 calls on sending chunked encoded data
- Use TCP_CORK and TCP_NODELAY to optimize network latency and throughput #680
- Weboscket XOR performance improved #687
- Avoid sending cookie attributes in Cookie header #613
- Round server timeouts to second for grouping pending call. That leads to less amount of poller syscalls e.g epoll.poll(). #702
- Close connection on websocket hadshake error #703
- Implement class based views #684
- Add headers parameter to ws_connect() #709
- Drop unused function parse_remote_addr() #708
- Close session on exception #707
- Store http code and headers in WSServerHandshakeError #706
- Make some low-level message properies readonly #710
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.