@@ -305,7 +305,7 @@ class Pool:
305305 """
306306
307307 __slots__ = (
308- '_queue' , '_loop' , '_minsize' , '_maxsize' ,
308+ '_queue' , '_loop' , '_minsize' , '_maxsize' , '_middlewares' ,
309309 '_init' , '_connect_args' , '_connect_kwargs' ,
310310 '_working_addr' , '_working_config' , '_working_params' ,
311311 '_holders' , '_initialized' , '_initializing' , '_closing' ,
@@ -320,6 +320,7 @@ def __init__(self, *connect_args,
320320 max_inactive_connection_lifetime ,
321321 setup ,
322322 init ,
323+ middlewares ,
323324 loop ,
324325 connection_class ,
325326 ** connect_kwargs ):
@@ -377,6 +378,7 @@ def __init__(self, *connect_args,
377378 self ._closed = False
378379 self ._generation = 0
379380 self ._init = init
381+ self ._middlewares = middlewares
380382 self ._connect_args = connect_args
381383 self ._connect_kwargs = connect_kwargs
382384
@@ -469,6 +471,7 @@ async def _get_new_connection(self):
469471 * self ._connect_args ,
470472 loop = self ._loop ,
471473 connection_class = self ._connection_class ,
474+ middlewares = self ._middlewares ,
472475 ** self ._connect_kwargs )
473476
474477 self ._working_addr = con ._addr
@@ -483,6 +486,7 @@ async def _get_new_connection(self):
483486 addr = self ._working_addr ,
484487 timeout = self ._working_params .connect_timeout ,
485488 config = self ._working_config ,
489+ middlewares = self ._middlewares ,
486490 params = self ._working_params ,
487491 connection_class = self ._connection_class )
488492
@@ -784,13 +788,37 @@ def __await__(self):
784788 return self .pool ._acquire (self .timeout ).__await__ ()
785789
786790
791+ def middleware (f ):
792+ """Decorator for adding a middleware
793+
794+ Can be used like such
795+
796+ .. code-block:: python
797+
798+ @pool.middleware
799+ async def my_middleware(query, args, limit,
800+ timeout, return_status, *, handler, conn):
801+ print('do something before')
802+ result, stmt = await handler(query, args, limit,
803+ timeout, return_status)
804+ print('do something after')
805+ return result, stmt
806+
807+ my_pool = await pool.create_pool(middlewares=[my_middleware])
808+ """
809+ async def middleware_factory (connection , handler ):
810+ return functools .partial (f , connection = connection , handler = handler )
811+ return middleware_factory
812+
813+
787814def create_pool (dsn = None , * ,
788815 min_size = 10 ,
789816 max_size = 10 ,
790817 max_queries = 50000 ,
791818 max_inactive_connection_lifetime = 300.0 ,
792819 setup = None ,
793820 init = None ,
821+ middlewares = None ,
794822 loop = None ,
795823 connection_class = connection .Connection ,
796824 ** connect_kwargs ):
@@ -866,6 +894,22 @@ def create_pool(dsn=None, *,
866894 or :meth:`Connection.set_type_codec() <\
867895 asyncpg.connection.Connection.set_type_codec>`.
868896
897+ :param middlewares:
898+ A list of middleware functions to be middleware just
899+ before a connection excecutes a statement.
900+ Syntax of a middleware is as follows:
901+
902+ .. code-block:: python
903+
904+ async def middleware_factory(connection, handler):
905+ async def middleware(query, args, limit, timeout, return_status):
906+ print('do something before')
907+ result, stmt = await handler(query, args, limit,
908+ timeout, return_status)
909+ print('do something after')
910+ return result, stmt
911+ return middleware
912+
869913 :param loop:
870914 An asyncio event loop instance. If ``None``, the default
871915 event loop will be used.
@@ -893,6 +937,7 @@ def create_pool(dsn=None, *,
893937 dsn ,
894938 connection_class = connection_class ,
895939 min_size = min_size , max_size = max_size ,
896- max_queries = max_queries , loop = loop , setup = setup , init = init ,
940+ max_queries = max_queries , loop = loop , setup = setup ,
941+ middlewares = middlewares , init = init ,
897942 max_inactive_connection_lifetime = max_inactive_connection_lifetime ,
898943 ** connect_kwargs )
0 commit comments