.. _using_the_interfaces:
Using the interfaces
=====================
For now project has set of different interfaces. You can install each manually or using the extra parameters:
:code:`pip install sanic_session[aioredis]`
Other supported backend keywords:
- :code:`aioredis` (dependency 'aioredis'),
- :code:`redis` ('asyncio_redis'),
- :code:`mongo` ('sanic_motor' and 'pymongo'),
- :code:`aiomcache` ('aiomcache')
Redis (asyncio_redis)
-----------------
`Redis `_ is a popular and widely supported key-value store. In order to interface with redis, you will need to add :code:`asyncio_redis` to your project. Do so with pip:
:code:`pip install asyncio_redis` or :code:`pip install sanic_session[redis]`
To integrate Redis with :code:`sanic_session` you need to pass a getter method into the :code:`RedisSessionInterface` which returns a connection pool. This is required since there is no way to synchronously create a connection pool. An example is below:
.. code-block:: python
import asyncio_redis
from sanic import Sanic
from sanic.response import text
from sanic_session import Session, RedisSessionInterface
app = Sanic()
class Redis:
"""
A simple wrapper class that allows you to share a connection
pool across your application.
"""
_pool = None
async def get_redis_pool(self):
if not self._pool:
self._pool = await asyncio_redis.Pool.create(
host='localhost', port=6379, poolsize=10
)
return self._pool
redis = Redis()
Session(app, interface=RedisSessionInterface(redis.get_redis_pool))
@app.route("/")
async def test(request):
# interact with the session like a normal dict
if not request.ctx.session.get('foo'):
request.ctx.session['foo'] = 0
request.ctx.session['foo'] += 1
response = text(request.ctx.session['foo'])
return response
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, debug=True)
Redis (aioredis)
-----------------
`aioredis` have little better syntax and more popular since it supported by `aiohttp` team.
:code:`pip install asyncio_redis` or :code:`pip install sanic_session[aioredis]`
This example shows little different approach. You can use classic Flask extensions approach with factory based initialization process. You can use it with different backends also.
.. code-block:: python
import aioredis
from sanic import Sanic
from sanic.response import text
from sanic_session import Session, AIORedisSessionInterface
app = Sanic(__name__, load_env=False)
# init extensions
session = Session()
@app.listener('before_server_start')
async def server_init(app, loop):
# For aioredis 1.x and older
# app.redis = await aioredis.create_redis_pool(app.config['redis'])
# For aioredis 2.x
app.redis = aioredis.from_url(app.config['redis'], decode_responses=True)
# init extensions fabrics
session.init_app(app, interface=AIORedisSessionInterface(app.redis))
@app.route("/")
async def test(request):
# interact with the session like a normal dict
if not request.ctx.session.get('foo'):
request.ctx.session['foo'] = 0
request.ctx.session['foo'] += 1
response = text(request.ctx.session['foo'])
return response
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, debug=True)
Memcache
-----------------
`Memcache `_ is another popular key-value storage system. In order to interface with memcache, you will need to add :code:`aiomcache` to your project. Do so with pip:
:code:`pip install aiomcache` or :code:`pip install sanic_session[aiomcache]`
To integrate memcache with :code:`sanic_session` you need to pass an :code:`aiomcache.Client` into the session interface, as follows:
.. code-block:: python
import aiomcache
import uvloop
from sanic import Sanic
from sanic.response import text
from sanic_session import Session, MemcacheSessionInterface
app = Sanic()
# create a uvloop to pass into the memcache client and sanic
loop = uvloop.new_event_loop()
# create a memcache client
client = aiomcache.Client("127.0.0.1", 11211, loop=loop)
# pass the memcache client into the session
session = Session(app, interface=MemcacheSessionInterface(client))
@app.route("/")
async def test(request):
# interact with the session like a normal dict
if not request.ctx.session.get('foo'):
request.ctx.session['foo'] = 0
request.ctx.session['foo'] += 1
response = text(request.ctx.session['foo'])
return response
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, debug=True, loop=loop)
In-Memory
-----------------
:code:`sanic_session` comes with an in-memory interface which stores sessions in a Python dictionary available at :code:`session_interface.session_store`. This interface is meant for testing and development purposes only. **This interface is not suitable for production**.
.. code-block:: python
from sanic import Sanic
from sanic.response import text
from sanic_session import Session
app = Sanic()
Session(app) # because InMemorySessionInterface used by default
# of full syntax:
# from sanic_session import InMemorySessionInterface
# session = Session(app, interface=InMemorySessionInterface())
@app.route("/")
async def index(request):
# interact with the session like a normal dict
if not request.ctx.session.get('foo'):
request.ctx.session['foo'] = 0
request.ctx.session['foo'] += 1
return text(request.ctx.session['foo'])
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, debug=True)