Metadata-Version: 2.2
Name: sanic-redis
Version: 0.5.3
Summary: Adds redis support to Sanic
Author-email: octal <octalgah@gmail.com>
License: MIT
Project-URL: Homepage, https://github.com/strahe/sanic-redis
Keywords: sanic,redis,hiredis
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Web Environment
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Topic :: Internet :: WWW/HTTP :: Session
Requires-Python: >=3.7
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: sanic
Requires-Dist: redis<6.0,>=5.0.0
Requires-Dist: hiredis<3.0,>=2.3.2
Provides-Extra: test
Requires-Dist: sanic-testing>=22.9.0; extra == "test"
Requires-Dist: pytest==8.0.*; extra == "test"
Requires-Dist: coverage; extra == "test"
Requires-Dist: beautifulsoup4; extra == "test"
Requires-Dist: pytest-sanic; extra == "test"
Requires-Dist: pytest-benchmark; extra == "test"
Requires-Dist: chardet==3.*; extra == "test"
Requires-Dist: flake8; extra == "test"
Requires-Dist: black; extra == "test"
Requires-Dist: isort>=5.0.0; extra == "test"
Requires-Dist: bandit; extra == "test"
Requires-Dist: mypy<0.910,>=0.901; extra == "test"
Requires-Dist: docutils; extra == "test"
Requires-Dist: pygments; extra == "test"
Requires-Dist: uvicorn<0.15.0; extra == "test"
Requires-Dist: slotscheck<1,>=0.8.0; extra == "test"

sanic-redis
==============
Async Redis support for sanic.

Built on top of Async version of [Redis library](https://redis-py.readthedocs.io/en/stable/examples/asyncio_examples.html).

[HiRedis](https://github.com/redis/hiredis-py) is used by default for parsing the read results for a higher performance.

Installation
------------

You can install this package as usual with pip:

    pip install sanic-redis

Config
-----------
For example:
```
redis://[[username]:[password]]@localhost:6379/0
rediss://[[username]:[password]]@localhost:6379/0
unix://[username@]/path/to/socket.sock?db=0[&password=password]
```

Three URL schemes are supported:
  - `redis://` creates a TCP socket connection. See more at:
    <https://www.iana.org/assignments/uri-schemes/prov/redis>
  - `rediss://` creates a SSL wrapped TCP socket connection. See more at:
    <https://www.iana.org/assignments/uri-schemes/prov/rediss>
  - ``unix://``: creates a Unix Domain Socket connection.

Details: https://github.com/redis/redis-py/blob/1a7d474268fe7072686369adc20aa498d63f063e/redis/client.py#L103-L141

All allow querystring options:
```
{
    "db": int,
    "socket_timeout": float,
    "socket_connect_timeout": float,
    "socket_keepalive": bool,
    "retry_on_timeout": bool,
    "max_connections": int,
    "health_check_interval": int,
    "ssl_check_hostname": bool,
}
```
Details: https://github.com/redis/redis-py/blob/cc4bc1a544d1030aec1696baef2861064fa8dd1c/redis/asyncio/connection.py#L854-L864

Example
------------

```python
from sanic import Sanic
from sanic.response import text
from sanic_redis import SanicRedis

app = Sanic(__name__)

app.config.update(
    {
        'REDIS': "redis://localhost:6379/0",
        'REDIS1': "redis://localhost:6379/1",
        'REDIS2': "redis://localhost:6379/2",
    }
)

redis = SanicRedis() # default config_name is "REDIS"
redis.init_app(app)

redis1 = SanicRedis(config_name="REDIS1")
redis1.init_app(app)

redis2 = SanicRedis(config_name="REDIS2")
redis2.init_app(app)


@app.route('/test1')
async def test1(request):
    async with redis1.conn as r:
        await r.set("key1", "value1")
        result = await r.get("key1")
    return text(str(result))


@app.route('/test2')
async def test2(request):
    r = request.app.ctx.redis
    await r.set('key2', 'value2')
    result = await r.get('key2')
    return text(str(result))


@app.route('/test3')
async def test3(request):
    # request.app.ctx.{redis_name}, the {redis_name} == config_name.lower()
    async with request.app.ctx.redis1 as r:
        await r.set('key3', 'value3')
        result = await r.get('key3')
    return text(str(result))


if __name__ == '__main__':
    app.run(debug=True)

```

Resources
---------

- [PyPI](https://pypi.python.org/pypi/sanic-redis)
