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