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
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
- async-timeout
- attrs
- chardet
- multidict
- yarl
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.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size aiohttp-3.6.0a5-cp35-cp35m-win32.whl (582.1 kB) | File type Wheel | Python version cp35 | Upload date | Hashes View |
Filename, size aiohttp-3.6.0a5-cp35-cp35m-win_amd64.whl (610.1 kB) | File type Wheel | Python version cp35 | Upload date | Hashes View |
Filename, size aiohttp-3.6.0a5-cp36-cp36m-win32.whl (588.0 kB) | File type Wheel | Python version cp36 | Upload date | Hashes View |
Filename, size aiohttp-3.6.0a5-cp36-cp36m-win_amd64.whl (615.7 kB) | File type Wheel | Python version cp36 | Upload date | Hashes View |
Filename, size aiohttp-3.6.0a5-cp37-cp37m-win32.whl (588.1 kB) | File type Wheel | Python version cp37 | Upload date | Hashes View |
Filename, size aiohttp-3.6.0a5-cp37-cp37m-win_amd64.whl (615.8 kB) | File type Wheel | Python version cp37 | Upload date | Hashes View |
Filename, size aiohttp-3.6.0a5-py3-none-any.whl (189.5 kB) | File type Wheel | Python version py3 | Upload date | Hashes View |
Filename, size aiohttp-3.6.0a5.tar.gz (1.1 MB) | File type Source | Python version None | Upload date | Hashes View |
Hashes for aiohttp-3.6.0a5-cp35-cp35m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d8d9dc49aeaa948314f998763ddcb7e5be33ecefbdc7222ca4634992084278ca |
|
MD5 | 036e52ae714a74138c8ff86909bb64ee |
|
BLAKE2-256 | 00903a66a2ce0da9ebe01cd3ad3be3d8b3c70ba533b9625aefa06fe51aa178b0 |
Hashes for aiohttp-3.6.0a5-cp35-cp35m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ca2f08a31133594a0bb857eebcef27e4123b6e1d62246dd60323a4e4fba2c47b |
|
MD5 | ac56764fe41719d45a98e3034631c80e |
|
BLAKE2-256 | 3c61bead9d25bf9f4acfe730eb761bfbb7941c8f63ad7b2900781b1e4b9e5494 |
Hashes for aiohttp-3.6.0a5-cp36-cp36m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 419230949520578a4cfaa23e5d0462e2a05291cd84d0467490368501a15b9659 |
|
MD5 | f1a8460df95ef5d3e32ab24f0be35d30 |
|
BLAKE2-256 | 784ee03c2bfa7cbbcae61b73780c922c774f599e0795f5a581f6c5f2b3f36bf9 |
Hashes for aiohttp-3.6.0a5-cp36-cp36m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b52a02fd138bc1b0a517bd79ac72ecff0daf75191541fb5ca6099294d576273d |
|
MD5 | 280e9f3e7fc36bf3448b4023dd0386a0 |
|
BLAKE2-256 | 5b743239bf5ce2c31e8bcadcbf5c7a65e7a87b2f578c8da9f8beef1a65eaa78e |
Hashes for aiohttp-3.6.0a5-cp37-cp37m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ba66b9d311b0f3f444ec7ec15015099533456eb4321a399d3e0f86989696f37a |
|
MD5 | e6ced7fb6e02ae7e8e6373bd8a188e34 |
|
BLAKE2-256 | 9900107ed8fe636423901ac12e3bbf27fa3d570d4095092446f94dbfda832af7 |
Hashes for aiohttp-3.6.0a5-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 19500d56781598f3f832ff4aa9b17613dabc9957b450663e9b1657be469ebcbf |
|
MD5 | a6aa66f9cdb4f05e640c7820aaab1617 |
|
BLAKE2-256 | 71e9862628eeeb2fa07617b614fba50c38d73c3bb74c28439389db81ee97e83d |
Hashes for aiohttp-3.6.0a5-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9761cb1c8b4d1c4063533d0c7ef0f4660b2cd9ea7f0a5657ce72201d21df4686 |
|
MD5 | 3f9975828bb42363143a6328a28d5cb6 |
|
BLAKE2-256 | 9e1eb1e17a16df2c1c591cc8c92a0ebedc7f3ee51356473618b7936eab516964 |