From 35c8c0b594fa676b0b94ad83ca41f08e09913ef9 Mon Sep 17 00:00:00 2001 From: Misha Behersky Date: Sun, 29 Apr 2018 12:36:28 +0300 Subject: [PATCH] Add example of how to use session to flash messages between requests --- demo/flash_messages_example.py | 54 ++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 demo/flash_messages_example.py diff --git a/demo/flash_messages_example.py b/demo/flash_messages_example.py new file mode 100644 index 00000000..0a31ff5b --- /dev/null +++ b/demo/flash_messages_example.py @@ -0,0 +1,54 @@ +import base64 +from cryptography import fernet +from aiohttp import web +from aiohttp_session import setup, get_session +from aiohttp_session.cookie_storage import EncryptedCookieStorage + + +def flash(request, message): + request.setdefault('flash_outgoing', []).append(message) + + +def get_messages(request): + return request.pop('flash_incoming') + + +async def flash_middleware(app, handler): + async def process(request): + session = await get_session(request) + request['flash_incoming'] = session.pop('flash', []) + response = await handler(request) + session['flash'] = (request.get('flash_incoming', []) + + request.get('flash_outgoing', [])) + return response + return process + + +async def flash_handler(request): + flash(request, 'You have just visited flash page') + return web.HTTPFound('/') + + +async def handler(request): + text = 'No flash messages yet' + messages = get_messages(request) + if messages: + text = 'Messages: {}'.format(','.join(messages)) + return web.Response(text=text) + + +def make_app(): + app = web.Application() + # secret_key must be 32 url-safe base64-encoded bytes + fernet_key = fernet.Fernet.generate_key() + secret_key = base64.urlsafe_b64decode(fernet_key) + setup(app, EncryptedCookieStorage(secret_key)) + app.router.add_get('/', handler) + app.router.add_get('/flash', flash_handler) + # Install flash middleware + app.middlewares.append(flash_middleware) + return app + + +web.run_app(make_app()) +