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.
Requirements
Python >= 3.4.1
Optionally you may install cChardet library: https://pypi-hypernode.com/pypi/cchardet/1.0.0
License
aiohttp is offered under the Apache 2 license.
Documentation
Discussion list
aio-libs google group: https://groups.google.com/forum/#!forum/aio-libs
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
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()
CHANGES
0.19.0 (11-25-2015)
Memory leak in ParserBuffer #579
Suppport gunicorn’s max_requests settings in gunicorn worker
Fix wsgi environment building #573
Improve access logging #572
Drop unused host and port from low-level server #586
Add Python 3.5 async for implementation to server websocket #543
Add Python 3.5 async for implementation to client websocket
Add Python 3.5 async with implementation to client websocket
Add charset parameter to web.Response constructor #593
Forbid passing both Content-Type header and content_type or charset params into web.Response constructor
Forbid duplicating of web.Application and web.Request #602
Add an option to pass Origin header in ws_connect #607
Add json_response function #592
Make concurrent connections respect limits #581
Collect history of responses if redirects occur #614
Enable passing pre-compressed data in requests #621
Expose named routes via UrlDispatcher.named_routes() #622
Allow disabling sendfile by environment variable AIOHTTP_NOSENDFILE #629
Use ensure_future if available
Always quote params for Content-Disposition #641
Support async for in multipart reader #640
Add Timeout context manager #611
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.