Skip to main content

Async http client/server framework (asyncio)

Project description

Async http client/server framework

aiohttp logo

Travis status for master branch AppVeyor status for master branch codecov.io status for master branch Latest PyPI package version Latest Read The Docs Chat on Gitter

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

https://aiohttp.readthedocs.io/

Demos

https://github.com/aio-libs/aiohttp-demos

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

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

  • FileResponse from web_fileresponse.py uses a ThreadPoolExecutor to work with files asynchronously. I/O based payloads from payload.py uses a ThreadPoolExecutor to work with I/O objects asynchronously. #3313

  • Internal Server Errors in plain text if the browser does not support HTML. #3483

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

  • Improve documentation of Application.make_handler parameters. (#3152)

  • Fix BaseRequest.raw_headers doc. (#3215)

  • Fix typo in TypeError exception reason in web.Application._handle (#3229)

  • Make server access log format placeholder %b documentation reflect behavior and docstring. (#3307)

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

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

aiohttp-3.6.0b0.tar.gz (1.1 MB view details)

Uploaded Source

Built Distributions

aiohttp-3.6.0b0-py3-none-any.whl (189.6 kB view details)

Uploaded Python 3

aiohttp-3.6.0b0-cp37-cp37m-win_amd64.whl (615.9 kB view details)

Uploaded CPython 3.7m Windows x86-64

aiohttp-3.6.0b0-cp37-cp37m-win32.whl (588.2 kB view details)

Uploaded CPython 3.7m Windows x86

aiohttp-3.6.0b0-cp37-cp37m-manylinux1_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.7m

aiohttp-3.6.0b0-cp37-cp37m-manylinux1_i686.whl (1.1 MB view details)

Uploaded CPython 3.7m

aiohttp-3.6.0b0-cp36-cp36m-win_amd64.whl (615.8 kB view details)

Uploaded CPython 3.6m Windows x86-64

aiohttp-3.6.0b0-cp36-cp36m-win32.whl (588.1 kB view details)

Uploaded CPython 3.6m Windows x86

aiohttp-3.6.0b0-cp36-cp36m-manylinux1_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.6m

aiohttp-3.6.0b0-cp36-cp36m-manylinux1_i686.whl (1.1 MB view details)

Uploaded CPython 3.6m

aiohttp-3.6.0b0-cp35-cp35m-win_amd64.whl (610.2 kB view details)

Uploaded CPython 3.5m Windows x86-64

aiohttp-3.6.0b0-cp35-cp35m-win32.whl (582.2 kB view details)

Uploaded CPython 3.5m Windows x86

aiohttp-3.6.0b0-cp35-cp35m-manylinux1_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.5m

aiohttp-3.6.0b0-cp35-cp35m-manylinux1_i686.whl (1.1 MB view details)

Uploaded CPython 3.5m

File details

Details for the file aiohttp-3.6.0b0.tar.gz.

File metadata

  • Download URL: aiohttp-3.6.0b0.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.5.4

File hashes

Hashes for aiohttp-3.6.0b0.tar.gz
Algorithm Hash digest
SHA256 868a3472d90d573266dc85ba5c776b4eaf745ef40f871ec7ab4c0f92294060ef
MD5 e0718b04617c008c1da3230bd26aff23
BLAKE2b-256 bfb300ab8dcab63d293ae598e1140ae94d96cd6b6e23a08cb00131e9333903ea

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-py3-none-any.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-py3-none-any.whl
  • Upload date:
  • Size: 189.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.5.3

File hashes

Hashes for aiohttp-3.6.0b0-py3-none-any.whl
Algorithm Hash digest
SHA256 bd7774c0505f891d599e50afaffd4d59cf3aae307c5de8e9b5a52cbb7e93c168
MD5 183b7c08450ba4c765597f89cca2f4c1
BLAKE2b-256 f6fef733951d6cc0b0cbf5df3277d01dd5a10d0f72b43582b21c86aff78d5a59

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 615.9 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.4

File hashes

Hashes for aiohttp-3.6.0b0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 f847f2100b6fe840b8eb1c0421c4506d6660ff7234ac34d15e50c096101f8fa2
MD5 0d3a00740fe3711b963c1e5a68a14e1b
BLAKE2b-256 2ac21fd4525fe183439f83bf14f009194d1d64254c5e9150974aa603f53d22b0

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp37-cp37m-win32.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 588.2 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.4

File hashes

Hashes for aiohttp-3.6.0b0-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 92bea782878bee1c04870f5184facdaaa9c314301cc4cc7e4287ce39563e1773
MD5 95e07d6d6b9706923f630232658e0b9a
BLAKE2b-256 c3f3d760e18e7a3a69c2f961a29b49c1f1f748429f19a32fb43b2ada1342cdb8

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.1

File hashes

Hashes for aiohttp-3.6.0b0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 041e33547c18a93366803e33821e66c69b1fbdd6145b83d674be653442ad4181
MD5 0cc1395bf6014fe3d15643e01b525a54
BLAKE2b-256 b35d5bbf35677f89b8a123548d51a79489da8fd6b68a0b1ccce5c5044549740a

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp37-cp37m-manylinux1_i686.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp37-cp37m-manylinux1_i686.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.1

File hashes

Hashes for aiohttp-3.6.0b0-cp37-cp37m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 a3025f39128ea418c879c0993cc0d95bcfb687bdfbaeb6dbd69be051e1368c1a
MD5 3f801b5a89c10ef0aa94b23be02babae
BLAKE2b-256 8597951f7f42247e3ace2fda211ac24de49065e003986ab07cd8567452f9e5c8

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 615.8 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.6.8

File hashes

Hashes for aiohttp-3.6.0b0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 eee75f5469a10be0b3e4fc13a7d1444ec5b9ea0533987e27d07573a9e0e2e8fa
MD5 f2154369eec70a10fe3cdcba903e2bc9
BLAKE2b-256 f3894df51374136fa7fdb0a2644268d5fa30e54992f1fc1ee51c7f315c785637

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp36-cp36m-win32.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp36-cp36m-win32.whl
  • Upload date:
  • Size: 588.1 kB
  • Tags: CPython 3.6m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.6.8

File hashes

Hashes for aiohttp-3.6.0b0-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 64b54a04eac3f5293ecc7c8164dd54eafbb3b3f0943a45b7cbb5cd918333ad12
MD5 1c1430f238bac84ddccd5074bb611d51
BLAKE2b-256 71f8a93f9c79c60baa15faa5e119641af4ba7cac97510bc829aa59c9be7a983f

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.1

File hashes

Hashes for aiohttp-3.6.0b0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0450fed4e38b8936e5c5c3ae14e88a57b0eee86a7de0a4c222a75d774e500db6
MD5 19f3b9cab74cf1357c1433fea48fddf9
BLAKE2b-256 4fe0f6a223013473ad3e5a4e61f2050a30b5c0b79a2b6fde17e6add0b2da8a3b

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp36-cp36m-manylinux1_i686.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp36-cp36m-manylinux1_i686.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.1

File hashes

Hashes for aiohttp-3.6.0b0-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 ed0c1f7e16ac5ecfe5e1b142e860efa07d5cc954ee4d44162e855fadcf8f1fb0
MD5 246edee3b9b962627a7b8838b2c1edb0
BLAKE2b-256 3446d7e2bc8a3a3798783e4cb4cd51d40fa26239bfa20609b608cbe12562bd88

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp35-cp35m-win_amd64.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp35-cp35m-win_amd64.whl
  • Upload date:
  • Size: 610.2 kB
  • Tags: CPython 3.5m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.5.4

File hashes

Hashes for aiohttp-3.6.0b0-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 4781a0aa0ee83fc6b9e0fb4d8fb3913db18cc5e057331629ed32bd5422f4b63c
MD5 16a97d95e732f6034d35e74d4f1a6f86
BLAKE2b-256 1e2b817285cc8ea344a98ca22231d7c7b2a95524b06f557ef57e1718225cfd6c

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp35-cp35m-win32.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp35-cp35m-win32.whl
  • Upload date:
  • Size: 582.2 kB
  • Tags: CPython 3.5m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.5.4

File hashes

Hashes for aiohttp-3.6.0b0-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 4b2f8dcdb3a51faeabc6cf3ca44b0db8ec0e0a4b76e0b4734254e91b820fb043
MD5 2f8082c6c30c8f69c3138f41db5d3f0c
BLAKE2b-256 43b8d28532e0841ec8b2a46ca06c1fe8b4bf6c91df969ddedbecdb8142c694bb

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp35-cp35m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.1

File hashes

Hashes for aiohttp-3.6.0b0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d2d9d957072007c06226d8c9bfac836dcb199e62552386106c18640c5874cb6a
MD5 9c0244847ecc098c2f9b03d4de08ed5e
BLAKE2b-256 5f9023bac07adffd65edfa9793c7779e02a654d31216e50aba2892936b5ed66d

See more details on using hashes here.

File details

Details for the file aiohttp-3.6.0b0-cp35-cp35m-manylinux1_i686.whl.

File metadata

  • Download URL: aiohttp-3.6.0b0-cp35-cp35m-manylinux1_i686.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.1

File hashes

Hashes for aiohttp-3.6.0b0-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 570203dcc2f3e1a8c3cf5355e8b2bc3c0028054e837bf1e394cb3209e8e9d64f
MD5 d29e906e5946523050c99fea44cd315c
BLAKE2b-256 8687e4da200ae41eca9ad75b948ed9342c5d55dded06c7a02403bc3ea51b0648

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page