From 1ffc82e5d5dc30ad7d09582385fcfc0ef840545b Mon Sep 17 00:00:00 2001 From: Juan Cruz Date: Sat, 18 Nov 2023 17:34:55 +0100 Subject: [PATCH] Update examples for aiohttp 3.9 (#943) Co-authored-by: Sam Bull --- demo/flash_messages_example.py | 22 ++++++++++------------ demo/login_required_example.py | 5 +++-- requirements.txt | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/demo/flash_messages_example.py b/demo/flash_messages_example.py index 269e410c..199a1d55 100644 --- a/demo/flash_messages_example.py +++ b/demo/flash_messages_example.py @@ -2,13 +2,12 @@ from typing import Awaitable, Callable, List, NoReturn, cast from aiohttp import web +from aiohttp.typedefs import Handler from cryptography import fernet from aiohttp_session import get_session, setup from aiohttp_session.cookie_storage import EncryptedCookieStorage -_Handler = Callable[[web.Request], Awaitable[web.StreamResponse]] - def flash(request: web.Request, message: str) -> None: request.setdefault("flash_outgoing", []).append(message) @@ -18,17 +17,16 @@ def get_messages(request: web.Request) -> List[str]: return cast(List[str], request.pop("flash_incoming")) -async def flash_middleware(app: web.Application, handler: _Handler) -> _Handler: - async def process(request: web.Request) -> web.StreamResponse: - session = await get_session(request) - request["flash_incoming"] = session.pop("flash", []) - response = await handler(request) +@web.middleware +async def flash_middleware(request: web.Request, handler: Handler) -> web.StreamResponse: + session = await get_session(request) + request["flash_incoming"] = session.pop("flash", []) + try: + return await handler(request) + finally: session["flash"] = request.get("flash_incoming", []) + request.get( "flash_outgoing", [] ) - return response - - return process async def flash_handler(request: web.Request) -> NoReturn: @@ -50,10 +48,10 @@ def make_app() -> web.Application: fernet_key = fernet.Fernet.generate_key() secret_key = base64.urlsafe_b64decode(fernet_key) setup(app, EncryptedCookieStorage(secret_key)) + # Install flash middleware (must be installed after aiohttp-session middleware). + app.middlewares.append(flash_middleware) app.router.add_get("/", handler) app.router.add_get("/flash", flash_handler) - # Install flash middleware - app.middlewares.append(flash_middleware) return app diff --git a/demo/login_required_example.py b/demo/login_required_example.py index ccb64920..b9eeb226 100644 --- a/demo/login_required_example.py +++ b/demo/login_required_example.py @@ -13,6 +13,7 @@ ] _Handler = Callable[[web.Request], Awaitable[web.StreamResponse]] +user_key = web.AppKey("user", str) def login_required(fn: _Handler) -> _Handler: async def wrapped( @@ -29,7 +30,7 @@ async def wrapped( user_id = session["user_id"] # actually load user from your database (e.g. with aiopg) user = DATABASE[user_id] - app["user"] = user + app[user_key] = user return await fn(request, *args, **kwargs) return wrapped @@ -37,7 +38,7 @@ async def wrapped( @login_required async def handler(request: web.Request) -> web.Response: - user = request.app["user"] + user = request.app[user_key] return web.Response(text=f"User {user} authorized") diff --git a/requirements.txt b/requirements.txt index 89364d44..59421703 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -e . -aiohttp==3.8.5 +aiohttp==3.9.0 aiomcache==0.8.1 cryptography==41.0.5 docker==6.1.3