Async http client/server framework (asyncio)
Project description
Async http client/server framework
Key Features
Supports both client and server side of HTTP protocol.
Supports both client and server Web-Sockets out-of-the-box and avoids Callback Hell.
Provides Web-server with middlewares and pluggable routing.
Getting started
Client
To get something from the web:
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'http://python.org')
print(html)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Server
An example using a simple server:
# examples/server_simple.py
from aiohttp import web
async def handle(request):
name = request.match_info.get('name', "Anonymous")
text = "Hello, " + name
return web.Response(text=text)
async def wshandle(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
if msg.type == web.WSMsgType.text:
await ws.send_str("Hello, {}".format(msg.data))
elif msg.type == web.WSMsgType.binary:
await ws.send_bytes(msg.data)
elif msg.type == web.WSMsgType.close:
break
return ws
app = web.Application()
app.add_routes([web.get('/', handle),
web.get('/echo', wshandle),
web.get('/{name}', handle)])
if __name__ == '__main__':
web.run_app(app)
Documentation
Demos
External links
Feel free to make a Pull Request for adding your link to these pages!
Communication channels
aio-libs google group: https://groups.google.com/forum/#!forum/aio-libs
Feel free to post your questions and ideas here.
gitter chat https://gitter.im/aio-libs/Lobby
We support Stack Overflow. Please add aiohttp tag to your question there.
Requirements
Python >= 3.5.3
Optionally you may install the cChardet and aiodns libraries (highly recommended for sake of speed).
License
aiohttp is offered under the Apache 2 license.
Keepsafe
The aiohttp community would like to thank Keepsafe (https://www.getkeepsafe.com) for its support in the early days of the project.
Source code
The latest developer version is available in a GitHub repository: https://github.com/aio-libs/aiohttp
Benchmarks
If you are interested in efficiency, the AsyncIO community maintains a list of benchmarks on the official wiki: https://github.com/python/asyncio/wiki/Benchmarks
Changelog
3.5.4 (2019-01-12)
Bugfixes
Fix stream .read() / .readany() / .iter_any() which used to return a partial content only in case of compressed content #3525
3.5.3 (2019-01-10)
Bugfixes
Fix type stubs for aiohttp.web.run_app(access_log=True) and fix edge case of access_log=True and the event loop being in debug mode. #3504
Fix aiohttp.ClientTimeout type annotations to accept None for fields #3511
Send custom per-request cookies even if session jar is empty #3515
Restore Linux binary wheels publishing on PyPI
3.5.2 (2019-01-08)
Features
Bugfixes
Preserve MultipartWriter parts headers on write.
Refactor the way how Payload.headers are handled. Payload instances now always have headers and Content-Type defined.
Fix Payload Content-Disposition header reset after initial creation. #3035
Log suppressed exceptions in GunicornWebWorker. #3464
Remove wildcard imports. #3468
Use the same task for app initialization and web server handling in gunicorn workers. It allows to use Python3.7 context vars smoothly. #3471
Fix handling of chunked+gzipped response when first chunk does not give uncompressed data #3477
Replace collections.MutableMapping with collections.abc.MutableMapping to avoid a deprecation warning. #3480
Payload.size type annotation changed from Optional[float] to Optional[int]. #3484
Ignore done tasks when cancels pending activities on web.run_app finalization. #3497
Improved Documentation
Add documentation for aiohttp.web.HTTPException. #3490
Misc
3.5.1 (2018-12-24)
Fix a regression about ClientSession._requote_redirect_url modification in debug mode.
3.5.0 (2018-12-22)
Features
The library type annotations are checked in strict mode now.
Add support for setting cookies for individual request (#2387)
Application.add_domain implementation (#2809)
The default app in the request returned by test_utils.make_mocked_request can now have objects assigned to it and retrieved using the [] operator. (#3174)
Make request.url accessible when transport is closed. (#3177)
Add zlib_executor_size argument to Response constructor to allow compression to run in a background executor to avoid blocking the main thread and potentially triggering health check failures. (#3205)
Enable users to set ClientTimeout in aiohttp.request (#3213)
Don’t raise a warning if NETRC environment variable is not set and ~/.netrc file doesn’t exist. (#3267)
Add default logging handler to web.run_app
If the Application.debug flag is set and the default logger aiohttp.access is used, access logs will now be output using a stderr StreamHandler if no handlers are attached. Furthermore, if the default logger has no log level set, the log level will be set to DEBUG. (#3324)
Add method argument to session.ws_connect().
Sometimes server API requires a different HTTP method for WebSocket connection establishment.
For example, Docker exec needs POST. (#3378)
Create a task per request handling. (#3406)
Bugfixes
Enable passing access_log_class via handler_args (#3158)
Return empty bytes with end-of-chunk marker in empty stream reader. (#3186)
Accept CIMultiDictProxy instances for headers argument in web.Response constructor. (#3207)
Don’t uppercase HTTP method in parser (#3233)
Make method match regexp RFC-7230 compliant (#3235)
Add app.pre_frozen state to properly handle startup signals in sub-applications. (#3237)
Enhanced parsing and validation of helpers.BasicAuth.decode. (#3239)
Change imports from collections module in preparation for 3.8. (#3258)
Ensure Host header is added first to ClientRequest to better replicate browser (#3265)
Fix forward compatibility with Python 3.8: importing ABCs directly from the collections module will not be supported anymore. (#3273)
Keep the query string by normalize_path_middleware. (#3278)
Fix missing parameter raise_for_status for aiohttp.request() (#3290)
Bracket IPv6 addresses in the HOST header (#3304)
Fix default message for server ping and pong frames. (#3308)
Fix tests/test_connector.py typo and tests/autobahn/server.py duplicate loop def. (#3337)
Fix false-negative indicator end_of_HTTP_chunk in StreamReader.readchunk function (#3361)
Release HTTP response before raising status exception (#3364)
Fix task cancellation when sendfile() syscall is used by static file handling. (#3383)
Fix stack trace for asyncio.TimeoutError which was not logged, when it is caught in the handler. (#3414)
Improved Documentation
Deprecations and Removals
Deprecate modification of session.requote_redirect_url (#2278)
Deprecate stream.unread_data() (#3260)
Deprecated use of boolean in resp.enable_compression() (#3318)
Encourage creation of aiohttp public objects inside a coroutine (#3331)
Drop dead Connection.detach() and Connection.writer. Both methods were broken for more than 2 years. (#3358)
Deprecate app.loop, request.loop, client.loop and connector.loop properties. (#3374)
Deprecate explicit debug argument. Use asyncio debug mode instead. (#3381)
Deprecate body parameter in HTTPException (and derived classes) constructor. (#3385)
Deprecate bare connector close, use async with connector: and await connector.close() instead. (#3417)
Deprecate obsolete read_timeout and conn_timeout in ClientSession constructor. (#3438)
Misc
#3341, #3351
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-3.6.0b0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bd7774c0505f891d599e50afaffd4d59cf3aae307c5de8e9b5a52cbb7e93c168 |
|
MD5 | 183b7c08450ba4c765597f89cca2f4c1 |
|
BLAKE2b-256 | f6fef733951d6cc0b0cbf5df3277d01dd5a10d0f72b43582b21c86aff78d5a59 |
Hashes for aiohttp-3.6.0b0-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f847f2100b6fe840b8eb1c0421c4506d6660ff7234ac34d15e50c096101f8fa2 |
|
MD5 | 0d3a00740fe3711b963c1e5a68a14e1b |
|
BLAKE2b-256 | 2ac21fd4525fe183439f83bf14f009194d1d64254c5e9150974aa603f53d22b0 |
Hashes for aiohttp-3.6.0b0-cp37-cp37m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 92bea782878bee1c04870f5184facdaaa9c314301cc4cc7e4287ce39563e1773 |
|
MD5 | 95e07d6d6b9706923f630232658e0b9a |
|
BLAKE2b-256 | c3f3d760e18e7a3a69c2f961a29b49c1f1f748429f19a32fb43b2ada1342cdb8 |
Hashes for aiohttp-3.6.0b0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 041e33547c18a93366803e33821e66c69b1fbdd6145b83d674be653442ad4181 |
|
MD5 | 0cc1395bf6014fe3d15643e01b525a54 |
|
BLAKE2b-256 | b35d5bbf35677f89b8a123548d51a79489da8fd6b68a0b1ccce5c5044549740a |
Hashes for aiohttp-3.6.0b0-cp37-cp37m-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a3025f39128ea418c879c0993cc0d95bcfb687bdfbaeb6dbd69be051e1368c1a |
|
MD5 | 3f801b5a89c10ef0aa94b23be02babae |
|
BLAKE2b-256 | 8597951f7f42247e3ace2fda211ac24de49065e003986ab07cd8567452f9e5c8 |
Hashes for aiohttp-3.6.0b0-cp36-cp36m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | eee75f5469a10be0b3e4fc13a7d1444ec5b9ea0533987e27d07573a9e0e2e8fa |
|
MD5 | f2154369eec70a10fe3cdcba903e2bc9 |
|
BLAKE2b-256 | f3894df51374136fa7fdb0a2644268d5fa30e54992f1fc1ee51c7f315c785637 |
Hashes for aiohttp-3.6.0b0-cp36-cp36m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 64b54a04eac3f5293ecc7c8164dd54eafbb3b3f0943a45b7cbb5cd918333ad12 |
|
MD5 | 1c1430f238bac84ddccd5074bb611d51 |
|
BLAKE2b-256 | 71f8a93f9c79c60baa15faa5e119641af4ba7cac97510bc829aa59c9be7a983f |
Hashes for aiohttp-3.6.0b0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0450fed4e38b8936e5c5c3ae14e88a57b0eee86a7de0a4c222a75d774e500db6 |
|
MD5 | 19f3b9cab74cf1357c1433fea48fddf9 |
|
BLAKE2b-256 | 4fe0f6a223013473ad3e5a4e61f2050a30b5c0b79a2b6fde17e6add0b2da8a3b |
Hashes for aiohttp-3.6.0b0-cp36-cp36m-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ed0c1f7e16ac5ecfe5e1b142e860efa07d5cc954ee4d44162e855fadcf8f1fb0 |
|
MD5 | 246edee3b9b962627a7b8838b2c1edb0 |
|
BLAKE2b-256 | 3446d7e2bc8a3a3798783e4cb4cd51d40fa26239bfa20609b608cbe12562bd88 |
Hashes for aiohttp-3.6.0b0-cp35-cp35m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4781a0aa0ee83fc6b9e0fb4d8fb3913db18cc5e057331629ed32bd5422f4b63c |
|
MD5 | 16a97d95e732f6034d35e74d4f1a6f86 |
|
BLAKE2b-256 | 1e2b817285cc8ea344a98ca22231d7c7b2a95524b06f557ef57e1718225cfd6c |
Hashes for aiohttp-3.6.0b0-cp35-cp35m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4b2f8dcdb3a51faeabc6cf3ca44b0db8ec0e0a4b76e0b4734254e91b820fb043 |
|
MD5 | 2f8082c6c30c8f69c3138f41db5d3f0c |
|
BLAKE2b-256 | 43b8d28532e0841ec8b2a46ca06c1fe8b4bf6c91df969ddedbecdb8142c694bb |
Hashes for aiohttp-3.6.0b0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d2d9d957072007c06226d8c9bfac836dcb199e62552386106c18640c5874cb6a |
|
MD5 | 9c0244847ecc098c2f9b03d4de08ed5e |
|
BLAKE2b-256 | 5f9023bac07adffd65edfa9793c7779e02a654d31216e50aba2892936b5ed66d |
Hashes for aiohttp-3.6.0b0-cp35-cp35m-manylinux1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 570203dcc2f3e1a8c3cf5355e8b2bc3c0028054e837bf1e394cb3209e8e9d64f |
|
MD5 | d29e906e5946523050c99fea44cd315c |
|
BLAKE2b-256 | 8687e4da200ae41eca9ad75b948ed9342c5d55dded06c7a02403bc3ea51b0648 |