2020 is_non_null_type , is_object_type )
2121from .values import (
2222 get_argument_values , get_directive_values , get_variable_values )
23+ from .middleware import MiddlewareManager
24+
2325
2426__all__ = [
2527 'add_path' , 'assert_valid_execution_arguments' , 'default_field_resolver' ,
@@ -64,7 +66,8 @@ def execute(
6466 schema : GraphQLSchema , document : DocumentNode ,
6567 root_value : Any = None , context_value : Any = None ,
6668 variable_values : Dict [str , Any ]= None ,
67- operation_name : str = None , field_resolver : GraphQLFieldResolver = None
69+ operation_name : str = None , field_resolver : GraphQLFieldResolver = None ,
70+ middleware : Optional [Union [Iterable [Any ], MiddlewareManager ]]= None
6871 ) -> MaybeAwaitable [ExecutionResult ]:
6972 """Execute a GraphQL operation.
7073
@@ -84,7 +87,7 @@ def execute(
8487 # arguments, a "Response" with only errors is returned.
8588 exe_context = ExecutionContext .build (
8689 schema , document , root_value , context_value ,
87- variable_values , operation_name , field_resolver )
90+ variable_values , operation_name , field_resolver , middleware )
8891
8992 # Return early errors if execution context failed.
9093 if isinstance (exe_context , list ):
@@ -116,6 +119,7 @@ class ExecutionContext:
116119 operation : OperationDefinitionNode
117120 variable_values : Dict [str , Any ]
118121 field_resolver : GraphQLFieldResolver
122+ middleware_manager : Optional [MiddlewareManager ]
119123 errors : List [GraphQLError ]
120124
121125 def __init__ (
@@ -125,6 +129,7 @@ def __init__(
125129 operation : OperationDefinitionNode ,
126130 variable_values : Dict [str , Any ],
127131 field_resolver : GraphQLFieldResolver ,
132+ middleware_manager : Optional [MiddlewareManager ],
128133 errors : List [GraphQLError ]) -> None :
129134 self .schema = schema
130135 self .fragments = fragments
@@ -133,6 +138,7 @@ def __init__(
133138 self .operation = operation
134139 self .variable_values = variable_values
135140 self .field_resolver = field_resolver # type: ignore
141+ self .middleware_manager = middleware_manager
136142 self .errors = errors
137143 self ._subfields_cache : Dict [
138144 Tuple [GraphQLObjectType , Tuple [FieldNode , ...]],
@@ -144,7 +150,8 @@ def build(
144150 root_value : Any = None , context_value : Any = None ,
145151 raw_variable_values : Dict [str , Any ]= None ,
146152 operation_name : str = None ,
147- field_resolver : GraphQLFieldResolver = None
153+ field_resolver : GraphQLFieldResolver = None ,
154+ middleware : Optional [Union [Iterable [Any ], MiddlewareManager ]]= None
148155 ) -> Union [List [GraphQLError ], 'ExecutionContext' ]:
149156 """Build an execution context
150157
@@ -157,6 +164,18 @@ def build(
157164 operation : Optional [OperationDefinitionNode ] = None
158165 has_multiple_assumed_operations = False
159166 fragments : Dict [str , FragmentDefinitionNode ] = {}
167+ middleware_manager : Optional [MiddlewareManager ] = None
168+ if middleware :
169+ if isinstance (middleware , Iterable ):
170+ middleware_manager = MiddlewareManager (* middleware )
171+ elif isinstance (middleware , MiddlewareManager ):
172+ middleware_manager = middleware
173+ else :
174+ raise TypeError (
175+ f"middlewares have to be an instance"
176+ "of MiddlewareManager. Received \" {middleware}\" "
177+ )
178+
160179 for definition in document .definitions :
161180 if isinstance (definition , OperationDefinitionNode ):
162181 if not operation_name and operation :
@@ -201,7 +220,8 @@ def build(
201220
202221 return cls (
203222 schema , fragments , root_value , context_value , operation ,
204- variable_values , field_resolver or default_field_resolver , errors )
223+ variable_values , field_resolver or default_field_resolver ,
224+ middleware_manager , errors )
205225
206226 def build_response (
207227 self , data : MaybeAwaitable [Optional [Dict [str , Any ]]]
@@ -447,6 +467,9 @@ def resolve_field(
447467
448468 resolve_fn = field_def .resolve or self .field_resolver
449469
470+ if self .middleware_manager :
471+ resolve_fn = self .middleware_manager .get_field_resolver (resolve_fn )
472+
450473 info = self .build_resolve_info (
451474 field_def , field_nodes , parent_type , path )
452475
0 commit comments