|
| 1 | +import base64 |
| 2 | +from cryptography import fernet |
| 3 | +from aiohttp import web |
| 4 | +from aiohttp_session import setup, get_session |
| 5 | +from aiohttp_session.cookie_storage import EncryptedCookieStorage |
| 6 | + |
| 7 | + |
| 8 | +def flash(request, message): |
| 9 | + request.setdefault('flash_outgoing', []).append(message) |
| 10 | + |
| 11 | + |
| 12 | +def get_messages(request): |
| 13 | + return request.pop('flash_incoming') |
| 14 | + |
| 15 | + |
| 16 | +async def flash_middleware(app, handler): |
| 17 | + async def process(request): |
| 18 | + session = await get_session(request) |
| 19 | + request['flash_incoming'] = session.pop('flash', []) |
| 20 | + response = await handler(request) |
| 21 | + session['flash'] = (request.get('flash_incoming', []) + |
| 22 | + request.get('flash_outgoing', [])) |
| 23 | + return response |
| 24 | + return process |
| 25 | + |
| 26 | + |
| 27 | +async def flash_handler(request): |
| 28 | + flash(request, 'You have just visited flash page') |
| 29 | + return web.HTTPFound('/') |
| 30 | + |
| 31 | + |
| 32 | +async def handler(request): |
| 33 | + text = 'No flash messages yet' |
| 34 | + messages = get_messages(request) |
| 35 | + if messages: |
| 36 | + text = 'Messages: {}'.format(','.join(messages)) |
| 37 | + return web.Response(text=text) |
| 38 | + |
| 39 | + |
| 40 | +def make_app(): |
| 41 | + app = web.Application() |
| 42 | + # secret_key must be 32 url-safe base64-encoded bytes |
| 43 | + fernet_key = fernet.Fernet.generate_key() |
| 44 | + secret_key = base64.urlsafe_b64decode(fernet_key) |
| 45 | + setup(app, EncryptedCookieStorage(secret_key)) |
| 46 | + app.router.add_get('/', handler) |
| 47 | + app.router.add_get('/flash', flash_handler) |
| 48 | + # Install flash middleware |
| 49 | + app.middlewares.append(flash_middleware) |
| 50 | + return app |
| 51 | + |
| 52 | + |
| 53 | +web.run_app(make_app()) |
| 54 | + |
0 commit comments