Package: aiohttp-edit
Async http client/server frameworkKey FeaturesSupports 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 plugable routing.Getting startedClientTo get something from the web:importaiohttpimportasyncioasyncdefmain():asyncwithaiohttp.ClientSession()assession:asyncwithsession.get('http://python.org')asresponse:print("Status:",response.status)print("Content-type:",response.headers['content-type'])html=awaitresponse.text()print("Body:",html[:15],"...")loop=asyncio.get_event_loop()loop.run_until_complete(main())This prints:Status: 200
Content-type: text/html; charset=utf-8
Body: <!doctype html> ...Coming fromrequests? Readwhy we need so many lines.ServerAn example using a simple server:# examples/server_simple.pyfromaiohttpimportwebasyncdefhandle(request):name=request.match_info.get('name',"Anonymous")text="Hello, "+namereturnweb.Response(text=text)asyncdefwshandle(request):ws=web.WebSocketResponse()awaitws.prepare(request)asyncformsginws:ifmsg.type==web.WSMsgType.text:awaitws.send_str("Hello,{}".format(msg.data))elifmsg.type==web.WSMsgType.binary:awaitws.send_bytes(msg.data)elifmsg.type==web.WSMsgType.close:breakreturnwsapp=web.Application()app.add_routes([web.get('/',handle),web.get('/echo',wshandle),web.get('/{name}',handle)])if__name__=='__main__':web.run_app(app)Documentationhttps://aiohttp.readthedocs.io/Demoshttps://github.com/aio-libs/aiohttp-demosExternal linksThird party librariesBuilt with aiohttpPowered by aiohttpFeel free to make a Pull Request for adding your link to these pages!Communication channelsaio-libs discourse group:https://aio-libs.discourse.groupgitter chathttps://gitter.im/aio-libs/LobbyWe supportStack Overflow.
Please addaiohttptag to your question there.RequirementsPython >= 3.6async-timeoutattrschardetmultidictyarlOptionally you may install thecChardetandaiodnslibraries (highly
recommended for sake of speed).Licenseaiohttpis offered under the Apache 2 license.KeepsafeThe aiohttp community would like to thank Keepsafe
(https://www.getkeepsafe.com) for its support in the early days of
the project.Source codeThe latest developer version is available in a GitHub repository:https://github.com/aio-libs/aiohttpBenchmarksIf you are interested in efficiency, the AsyncIO community maintains a
list of benchmarks on the official wiki:https://github.com/python/asyncio/wiki/BenchmarksChangelog3.7.4.post0 (2021-03-06)MiscBumped upper bound of thechardetruntime dependency
to allow their v4.0 version stream.#53663.7.4 (2021-02-25)Bugfixes(SECURITY BUG)Started preventing open redirects in theaiohttp.web.normalize_path_middlewaremiddleware. For
more details, seehttps://github.com/aio-libs/aiohttp/security/advisories/GHSA-v6wp-4m6f-gcjg.Thanks toBeast Glatisantfor
finding the first instance of this issue andJelmer Vernooĳfor reporting and tracking it down
in aiohttp.#5497Fix interpretation difference of the pure-Python and the Cython-based
HTTP parsers construct ayarl.URLobject for HTTP request-target.Before this fix, the Python parser would turn the URI’s absolute-path
for//some-pathinto/while the Cython code preserved it as//some-path. Now, both do the latter.#54983.7.3 (2020-11-18)FeaturesUse Brotli instead of brotlipy#3803Made exceptions pickleable. Also changed the repr of some exceptions.#4077BugfixesRaise a ClientResponseError instead of an AssertionError for a blank
HTTP Reason Phrase.#3532Fixweb_middlewares.normalize_path_middlewarebehavior for patch without slash.#3669Fix overshadowing of overlapped sub-applications prefixes.#3701MakeBaseConnector.close()a coroutine and wait until the client closes all connections. Drop deprecated “with Connector():” syntax.#3736Reset thesock_readtimeout each time data is received for aaiohttp.clientresponse.#3808Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View#3880Fixed querying the address families from DNS that the current host supports.#5156Change return type of MultipartReader.__aiter__() and BodyPartReader.__aiter__() to AsyncIterator.#5163Provide x86 Windows wheels.#5230Improved DocumentationAdd documentation foraiohttp.web.FileResponse.#3958Removed deprecation warning in tracing example docs#3964Fixed wrong “Usage” docstring ofaiohttp.client.request.#4603Add aiohttp-pydantic to third party libraries#5228Misc#41023.7.2 (2020-10-27)BugfixesFixed static files handling for loops without.sendfile()support#51493.7.1 (2020-10-25)BugfixesFixed a type error caused by the conditional import ofProtocol.#5111Server doesn’t send Content-Length for 1xx or 204#4901Fix run_app typing#4957Always requiretyping_extensionslibrary.#5107Fix a variable-shadowing bug causingThreadedResolver.resolveto
return the resolved IP as thehostnamein each record, which prevented
validation of HTTPS connections.#5110Added annotations to all public attributes.#5115Fix flaky test_when_timeout_smaller_second#5116Ensure sending a zero byte file does not throw an exception#5124Fix a bug inweb.run_app()about Python version checking on Windows#51273.7.0 (2020-10-24)FeaturesResponse headers are now prepared prior to runningon_response_preparehooks, directly before headers are sent to the client.#1958Add aquote_cookieoption toCookieJar, a way to skip quotation wrapping of cookies containing special characters.#2571CallAccessLogger.logwith the current exception available fromsys.exc_info().#3557web.UrlDispatcher.add_routesandweb.Application.add_routesreturn a list
of registeredAbstractRouteinstances.AbstractRouteDef.register(and all
subclasses) return a list of registered resources registered resource.#3866Added properties of default ClientSession params to ClientSession class so it is available for introspection#3882Don’t cancel web handler on peer disconnection, raiseOSErroron reading/writing instead.#4080Implement BaseRequest.get_extra_info() to access a protocol transports’ extra info.#4189AddedClientSession.timeoutproperty.#4191allow use of SameSite in cookies.#4224Useloop.sendfile()instead of custom implementation if available.#4269Apply SO_REUSEADDR to test server’s socket.#4393Use .raw_host instead of slower .host in client API#4402Allow configuring the buffer size of input stream by passingread_bufsizeargument.#4453Pass tests on Python 3.8 for Windows.#4513Addmethodandurlattributes toTraceRequestChunkSentParamsandTraceResponseChunkReceivedParams.#4674Add ClientResponse.ok property for checking status code under 400.#4711Don’t ceil timeouts that are smaller than 5 seconds.#4850TCPSite now listens by default on all interfaces instead of just IPv4 whenNoneis passed in as the host.#4894Bumphttp_parserto 2.9.4#5070BugfixesFix keepalive connections not being closed in time#3296Fix failed websocket handshake leaving connection hanging.#3380Fix tasks cancellation order on exit. The run_app task needs to be cancelled first for cleanup hooks to run with all tasks intact.#3805Don’t start heartbeat until _writer is set#4062Fix handling of multipart file uploads without a content type.#4089Preserve view handler function attributes across middlewares#4174Fix the string representation ofServerDisconnectedError.#4175Raising RuntimeError when trying to get encoding from not read body#4214Remove warning messages from noop.#4282Raise ClientPayloadError if FormData re-processed.#4345Fix a warning about unfinished task inweb_protocol.py#4408Fixed ‘deflate’ compression. According to RFC 2616 now.#4506Fixed OverflowError on platforms with 32-bit time_t#4515Fixed request.body_exists returns wrong value for methods without body.#4528Fix connecting to link-local IPv6 addresses.#4554Fix a problem with connection waiters that are never awaited.#4562Always make sure transport is not closing before reuse a connection.Reuse a protocol based on keepalive in headers is unreliable.
For example, uWSGI will not support keepalive even it serves a
HTTP 1.1 request, except explicitly configure uWSGI with a--http-keepaliveoption.Servers designed like uWSGI could cause aiohttp intermittently
raise a ConnectionResetException when the protocol poll runs
out and some protocol is reused.#4587Handle the last CRLF correctly even if it is received via separate TCP segment.#4630Fix the register_resource function to validate route name before splitting it so that route name can include python keywords.#4691Improve typing annotations forweb.Request,aiohttp.ClientResponseandmultipartmodule.#4736Fix resolver task is not awaited when connector is cancelled#4795Fix a bug “Aiohttp doesn’t return any error on invalid request methods”#4798Fix HEAD requests for static content.#4809Fix incorrect size calculation for memoryview#4890Add HTTPMove to _all__.#4897Fixed the type annotations in thetracingmodule.#4912Fix typing for multipart__aiter__.#4931Fix for race condition on connections in BaseConnector that leads to exceeding the connection limit.#4936Add forced UTF-8 encoding forapplication/rdap+jsonresponses.#4938Fix inconsistency between Python and C http request parsers in parsing pct-encoded URL.#4972Fix connection closing issue in HEAD request.#5012Fix type hint on BaseRunner.addresses (fromList[str]toList[Any])#5086Makeweb.run_app()more responsive to Ctrl+C on Windows for Python < 3.8. It slightly
increases CPU load as a side effect.#5098Improved DocumentationFix example code in client quick-start#3376Updated the docs so there is no contradiction inttl_dns_cachedefault value#3512Add ‘Deploy with SSL’ to docs.#4201Change typing of the secure argument on StreamResponse.set_cookie fromOptional[str]toOptional[bool]#4204Changesttl_dns_cachetype from int to Optional[int].#4270Simplify README hello word example and add a documentation page for people coming from requests.#4272Improve some code examples in the documentation involving websockets and starting a simple HTTP site with an AppRunner.#4285Fix typo in code example in Multipart docs#4312Fix code example in Multipart section.#4314Update contributing guide so new contributors read the most recent version of that guide. Update command used to create test coverage reporting.#4810Spelling: Change “canonize” to “canonicalize”.#4986Addaiohttp-sse-clientlibrary to third party usage list.#5084Misc#2856,#4218,#42503.6.3 (2020-10-12)BugfixesPin yarl to<1.6.0to avoid buggy behavior that will be fixed by the next aiohttp
release.3.6.2 (2019-10-09)FeaturesMade exceptions pickleable. Also changed the repr of some exceptions.#4077UseIterabletype hint instead ofSequenceforApplicationmiddlewareparameter.#4125BugfixesReset thesock_readtimeout each time data is received for aaiohttp.ClientResponse.#3808Fix handling of expired cookies so they are not stored in CookieJar.#4063Fix misleading message in the string representation ofClientConnectorError;self.ssl == Nonemeans default SSL context, not SSL disabled#4097Don’t clobber HTTP status when using FileResponse.#4106Improved DocumentationAdded minimal required logging configuration to logging documentation.#2469Update docs to reflect proxy support.#4100Fix typo in code example in testing docs.#4108Misc#41023.6.1 (2019-09-19)FeaturesCompatibility with Python 3.8.#4056Bugfixescorrect some exception string format#4068Emit a warning whenssl.OP_NO_COMPRESSIONis
unavailable because the runtime is built against
an outdated OpenSSL.#4052Update multidict requirement to >= 4.5#4057Improved DocumentationProvide pytest-aiohttp namespace for pytest fixtures in docs.#37233.6.0 (2019-09-06)FeaturesAdd support for Named Pipes (Site and Connector) under Windows. This feature requires
Proactor event loop to work.#3629RemovedTransfer-Encoding:chunkedheader from websocket responses to be
compatible with more http proxy servers.#3798Accept non-GET request for starting websocket handshake on server side.#3980BugfixesRaise a ClientResponseError instead of an AssertionError for a blank
HTTP Reason Phrase.#3532Fix an issue where cookies would sometimes not be set during a redirect.#3576Change normalize_path_middleware to use 308 redirect instead of 301.This behavior should prevent clients from being unable to use PUT/POST
methods on endpoints that are redirected because of a trailing slash.#3579Drop the processed task fromall_tasks()list early. It prevents logging about a
task with unhandled exception when the server is used in conjunction withasyncio.run().#3587Signaltype annotation changed fromSignal[Callable[['TraceConfig'],Awaitable[None]]]toSignal[Callable[ClientSession, SimpleNamespace,...].#3595Use sanitized URL as Location header in redirects#3614Improve typing annotations for multipart.py along with changes required
by mypy in files that references multipart.py.#3621Close session created insideaiohttp.requestwhen unhandled exception occurs#3628Cleanup per-chunk data in generic data read. Memory leak fixed.#3631Use correct type for add_view and family#3633Fix _keepalive field in __slots__ ofRequestHandler.#3644Properly handle ConnectionResetError, to silence the “Cannot write to closing
transport” exception when clients disconnect uncleanly.#3648Suppress pytest warnings due totest_utilsclasses#3660Fix overshadowing of overlapped sub-application prefixes.#3701Fixed return type annotation for WSMessage.json()#3720Properly expose TooManyRedirects publicly as documented.#3818Fix missing brackets for IPv6 in proxy CONNECT request#3841Make the signature ofaiohttp.test_utils.TestClient.requestmatchasyncio.ClientSession.requestaccording to the docs#3852Use correct style for re-exported imports, makes mypy--strictmode happy.#3868Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of
View#3880Made cython HTTP parser set Reason-Phrase of the response to an empty string if it is
missing.#3906Add URL to the string representation of ClientResponseError.#3959Acceptistrkeys inLooseHeaderstype hints.#3976Fixed race conditions in _resolve_host caching and throttling when tracing is enabled.#4013For URLs like “unix://localhost/…” set Host HTTP header to “localhost” instead of
“localhost:None”.#4039Improved DocumentationModify documentation for Background Tasks to remove deprecated usage of event loop.#3526useif __name__ == '__main__':in server examples.#3775Update documentation reference to the default access logger.#3783Improve documentation forweb.BaseRequest.pathandweb.BaseRequest.raw_path.#3791Removed deprecation warning in tracing example docs#39643.5.4 (2019-01-12)BugfixesFix stream.read()/.readany()/.iter_any()which used to return a
partial content only in case of compressed content#35253.5.3 (2019-01-10)BugfixesFix type stubs foraiohttp.web.run_app(access_log=True)and fix edge case ofaccess_log=Trueand the event loop being in debug mode.#3504Fixaiohttp.ClientTimeouttype annotations to acceptNonefor fields#3511Send custom per-request cookies even if session jar is empty#3515Restore Linux binary wheels publishing on PyPI3.5.2 (2019-01-08)FeaturesFileResponsefromweb_fileresponse.pyuses aThreadPoolExecutorto work
with files asynchronously.  I/O based payloads frompayload.pyuses aThreadPoolExecutorto work with I/O objects asynchronously.#3313Internal Server Errors in plain text if the browser does not support HTML.#3483BugfixesPreserve MultipartWriter parts headers on write.  Refactor the way howPayload.headersare handled. Payload instances now always have headers and
Content-Type defined.  Fix Payload Content-Disposition header reset after initial
creation.#3035Log suppressed exceptions inGunicornWebWorker.#3464Remove wildcard imports.#3468Use the same task for app initialization and web server handling in gunicorn workers.
It allows to use Python3.7 context vars smoothly.#3471Fix handling of chunked+gzipped response when first chunk does not give uncompressed
data#3477Replacecollections.MutableMappingwithcollections.abc.MutableMappingto
avoid a deprecation warning.#3480Payload.sizetype annotation changed fromOptional[float]toOptional[int].#3484Ignore done tasks when cancels pending activities onweb.run_appfinalization.#3497Improved DocumentationAdd documentation foraiohttp.web.HTTPException.#3490Misc#34873.5.1 (2018-12-24)Fix a regression aboutClientSession._requote_redirect_urlmodification in debug
mode.3.5.0 (2018-12-22)FeaturesThe library type annotations are checked in strict mode now.Add support for setting cookies for individual request (#2387)Application.add_domain implementation (#2809)The defaultappin the request returned bytest_utils.make_mocked_requestcan
now have objects assigned to it and retrieved using the[]operator. (#3174)Makerequest.urlaccessible when transport is closed. (#3177)Addzlib_executor_sizeargument toResponseconstructor 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 setClientTimeoutinaiohttp.request(#3213)Don’t raise a warning ifNETRCenvironment variable is not set and~/.netrcfile doesn’t exist. (#3267)Add default logging handler to web.run_app If theApplication.debug`flag is set
and the default loggeraiohttp.accessis used, access logs will now be output
using astderrStreamHandlerif no handlers are attached. Furthermore, if the
default logger has no log level set, the log level will be set toDEBUG. (#3324)Add method argument tosession.ws_connect().  Sometimes server API requires a
different HTTP method for WebSocket connection establishment.  For example,Docker execneeds POST. (#3378)Create a task per request handling. (#3406)BugfixesEnable passingaccess_log_classviahandler_args(#3158)Return empty bytes with end-of-chunk marker in empty stream reader. (#3186)AcceptCIMultiDictProxyinstances forheadersargument inweb.Responseconstructor. (#3207)Don’t uppercase HTTP method in parser (#3233)Make method match regexp RFC-7230 compliant (#3235)Addapp.pre_frozenstate 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 bynormalize_path_middleware. (#3278)Fix missing parameterraise_for_statusfor 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 whensendfile()syscall is used by static file
handling. (#3383)Fix stack trace forasyncio.TimeoutErrorwhich was not logged, when it is caught
in the handler. (#3414)Improved DocumentationImprove documentation ofApplication.make_handlerparameters. (#3152)Fix BaseRequest.raw_headers doc. (#3215)Fix typo in TypeError exception reason inweb.Application._handle(#3229)Make server access log format placeholder %b documentation reflect
behavior and docstring. (#3307)Deprecations and RemovalsDeprecate modification ofsession.requote_redirect_url(#2278)Deprecatestream.unread_data()(#3260)Deprecated use of boolean inresp.enable_compression()(#3318)Encourage creation of aiohttp public objects inside a coroutine (#3331)Drop deadConnection.detach()andConnection.writer. Both methods were broken
for more than 2 years. (#3358)Deprecateapp.loop,request.loop,client.loopandconnector.loopproperties. (#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, useasync with connector:andawait connector.close()instead. (#3417)Deprecate obsoleteread_timeoutandconn_timeoutinClientSessionconstructor. (#3438)Misc#3341, #3351