Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/inn0le/sanic_sse
Sanic Server-Sent Events extension
https://github.com/inn0le/sanic_sse
asyncio python3 sanic server-sent-events sse
Last synced: 30 days ago
JSON representation
Sanic Server-Sent Events extension
- Host: GitHub
- URL: https://github.com/inn0le/sanic_sse
- Owner: inn0kenty
- License: mit
- Created: 2018-08-16T17:37:22.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2022-03-13T22:16:10.000Z (almost 3 years ago)
- Last Synced: 2024-06-23T07:41:31.421Z (6 months ago)
- Topics: asyncio, python3, sanic, server-sent-events, sse
- Language: Python
- Size: 90.8 KB
- Stars: 21
- Watchers: 3
- Forks: 6
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-sanic - sanic-sse - Sent Events](https://en.wikipedia.org/wiki/Server-sent_events) implementation for Sanic. (Extensions / Utils)
README
# Sanic Server-Sent Events extension
![Publish](https://github.com/inn0kenty/sanic_sse/workflows/Publish/badge.svg)
A Sanic extension for HTML5 [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) support, inspired by [flask-sse](https://github.com/singingwolfboy/flask-sse) and [aiohttp-sse](https://github.com/aio-libs/aiohttp-sse).
## Install
Installation process as simple as:
```bash
$ pip install sanic_sse
```## Example
Server example:
```python
from http import HTTPStatus
from sanic import Sanic
from sanic.response import json, json_dumps
from sanic.exceptions import abort
from sanic_sse import Sse# This function is optional callback before sse request
# You can use it for authorization purpose or something else
async def before_sse_request(request):
if request.headers.get("Auth", "") != "some_token":
abort(HTTPStatus.UNAUTHORIZED, "Bad auth token")sanic_app = Sanic()
# The default sse url is /sse but you can set it via init argument url.
Sse(
sanic_app, url="/events", before_request_func=before_sse_request
) # or you can use init_app method@sanic_app.route("/send", methods=["POST"])
async def send_event(request):
# if channel_id is None than event will be send to all subscribers
channel_id = request.json.get("channel_id")# optional arguments: event_id - str, event - str, retry - int
# data should always be str
try:
await request.app.sse_send(json_dumps(request.json), channel_id=channel_id)
except KeyError:
abort(HTTPStatus.NOT_FOUND, "channel not found")return json({"status": "ok"})
if __name__ == "__main__":
sanic_app.run(host="0.0.0.0", port=8000)
```Client example (powered by [sseclient-py](https://github.com/mpetazzoni/sseclient) and [requests](https://github.com/requests/requests)):
```python
import json
import pprint
import requests
import sseclienturl = "http://127.0.0.1:8000/events"
# you may set channel_id parameter to receive special events
# url = "http://127.0.0.1:8000/events?channel_id=foo"response = requests.get(url, stream=True)
client = sseclient.SSEClient(response)
for event in client.events():
print(event.id)
print(event.event)
print(event.retry)
pprint.pprint(json.loads(event.data))
```## Requirements
- [python](https://www.python.org/) 3.5+
- [sanic](https://github.com/channelcat/sanic) 0.7.0+