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): with aiohttp.Timeout(10): async with session.get(url) as response: return await response.text() if __name__ == '__main__': loop = asyncio.get_event_loop() with aiohttp.ClientSession(loop=loop) as session: html = loop.run_until_complete( fetch(session, 'http://python.org')) print(html)
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.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 app = web.Application() app.router.add_route('GET', '/echo', wshandler) app.router.add_route('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()
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.22.3 (07-26-2016)
- Do not filter cookies if unsafe flag provided #1005
0.22.2 (07-23-2016)
- Suppress CancelledError when Timeout raises TimeoutError #970
- Don’t expose aiohttp.__version__
- Add unsafe parameter to CookieJar #968
- Use unsafe cookie jar in test client tools
- Expose aiohttp.CookieJar name
0.22.1 (07-16-2016)
- Large cookie expiration/max-age doesn’t break an event loop from now (fixes #967)
0.22.0 (07-15-2016)
- Fix bug in serving static directory #803
- Fix command line arg parsing #797
- Fix a documentation chapter about cookie usage #790
- Handle empty body with gzipped encoding #758
- Support 451 Unavailable For Legal Reasons http status #697
- Fix Cookie share example and few small typos in docs #817
- UrlDispatcher.add_route with partial coroutine handler #814
- Optional support for aiodns #728
- Add ServiceRestart and TryAgainLater websocket close codes #828
- Fix prompt message for web.run_app #832
- Allow to pass None as a timeout value to disable timeout logic #834
- Fix leak of connection slot during connection erro #835
- Gunicorn worker with uvloop support aiohttp.worker.GunicornUVLoopWebWorker #878
- Don’t send body in response to HEAD request #838
- Skip the preamble in MultipartReader #881
- Implement BasicAuth decode classmethod. #744
- Don’t crash logger when transport is None #889
- Use a create_future compatibility wrapper instead of creating Futures directly #896
- Add test utilities to aiohttp #902
- Improve Request.__repr__ #875
- Skip DNS resolving if provided host is already an ip address #874
- Add headers to ClientSession.ws_connect #785
- Document that server can send pre-compressed data #906
- Don’t add Content-Encoding and Transfer-Encoding if no body #891
- Add json() convenience methods to websocket message objects #897
- Add client_resp.raise_for_status() #908
- Implement cookie filter #799
- Include an example of middleware to handle error pages #909
- Fix error handling in StaticFileMixin #856
- Add mocked request helper #900
- Fix empty ALLOW Response header for cls based View #929
- Respect CONNECT method to implement a proxy server #847
- Add pytest_plugin #914
- Add tutorial
- Add backlog option to support more than 128 (default value in “create_server” function) concurrent connections #892
- Allow configuration of header size limits #912
- Separate sending file logic from StaticRoute dispatcher #901
- Drop deprecated share_cookies connector option (BACKWARD INCOMPATIBLE)
- Drop deprecated support for tuple as auth paramter. Use aiohttp.BasicAuth instead (BACKWARD INCOMPATIBLE)
- Remove deprecated request.payload property, use content instead. (BACKWARD INCOMPATIBLE)
- Drop all mentions about api changes in documentaion for versions older than 0.16
- Allow to override default cookie jar #963
- Add manylinux wheel builds
- Dup a socket for sendfile usage #964
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.
Source Distribution
Built Distributions
Hashes for aiohttp-0.22.4-cp35-cp35m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 334f956a1908b46cead8568fa70ba80caab73780986ce65de28b08248e6656a5 |
|
MD5 | 83fdd16df0d9cefc0c3f2d1ae421d501 |
|
BLAKE2-256 | f4be787ab477c1a8b92d0f773318aa713976ce9efa2cde7750b2a635891026d7 |
Hashes for aiohttp-0.22.4-cp35-cp35m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 88bf0bb3eb3557229317a393bc2d5d1dbcb4b65170cedcf33e2e6b33acac72ac |
|
MD5 | d94440f371a72bc4038c88734bb8aae1 |
|
BLAKE2-256 | ac8ff83a3f807da64ed797fa502f939bc20c60cdcdd4f54591edabcdc1be07fb |
Hashes for aiohttp-0.22.4-cp35-cp35m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 40f96e8421d0d6e92e3a7a8d4ca30e87bdd972558f8814de9fe82b422e23ea83 |
|
MD5 | cde9372e8168e3cb9d916e78cd2c91d4 |
|
BLAKE2-256 | 75c753b297b957c5435a5e9317af5881f74c852fd51643694f2227fda2db3cd7 |
Hashes for aiohttp-0.22.4-cp35-cp35m-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 18dcacae4decbca72002444f7901ce5f6419f2171ded919f6abf71176bef44be |
|
MD5 | e2e334b732ed4883f9a9b1d9667eacce |
|
BLAKE2-256 | ca045ba7b9ee275b0479531e4ee460f9a8b6daf1a5ebcef49eccbdad08ffb3e4 |
Hashes for aiohttp-0.22.4-cp34-cp34m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5c6941c4df28a518c122d3595eee6c3e1fd93e7ac0074187cad5a1e1ec77fa79 |
|
MD5 | 376657e7b258e1ff8f15106336552803 |
|
BLAKE2-256 | 4c6a912e3af457fed0b5af140a89139f1d62b3afc7590bb77f73d40d74167042 |
Hashes for aiohttp-0.22.4-cp34-cp34m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e447c5063642333d7f789e51b9a9cb4b784e483222ccbb35db93769d7517bb11 |
|
MD5 | b0cc7ff91a3bd0301d90133a965f8473 |
|
BLAKE2-256 | 91c75585a7ff01b4c745867c3d1eac458c06c7174f4982d52dfce6ab0390ad1e |
Hashes for aiohttp-0.22.4-cp34-cp34m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 457e74752cca12c25c74d2745fc875f26fe49218f308bf1d1c99461f146216f8 |
|
MD5 | 87ff487badfe6d2909948d73844a31a0 |
|
BLAKE2-256 | f71658e341b34d4f3081301c0fab68deb782e8e4ad37f1c402a68ad281b1dbdb |
Hashes for aiohttp-0.22.4-cp34-cp34m-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c237850ddef9236abe0de9a3e10572949e0cb805e376ffea7f1f7526c0cc2caf |
|
MD5 | 804f7a1dc1d2ab4bc6f6ad133fff1c6c |
|
BLAKE2-256 | accd8931ae288fa2c7dfb9b625b9987cc62dea97f0b305579b95bfa9fd8e0fc6 |