1010from django .views .generic import View
1111from django .views .decorators .csrf import ensure_csrf_cookie
1212
13- from graphql import Source , execute , parse , validate
13+ from graphql import get_default_backend
1414from graphql .error import format_error as format_graphql_error
1515from graphql .error import GraphQLError
1616from graphql .execution import ExecutionResult
@@ -59,16 +59,20 @@ class GraphQLView(View):
5959 schema = None
6060 graphiql = False
6161 executor = None
62+ backend = None
6263 middleware = None
6364 root_value = None
6465 pretty = False
6566 batch = False
6667
6768 def __init__ (self , schema = None , executor = None , middleware = None , root_value = None , graphiql = False , pretty = False ,
68- batch = False ):
69+ batch = False , backend = None ):
6970 if not schema :
7071 schema = graphene_settings .SCHEMA
7172
73+ if backend is None :
74+ backend = get_default_backend ()
75+
7276 if middleware is None :
7377 middleware = graphene_settings .MIDDLEWARE
7478
@@ -80,6 +84,7 @@ def __init__(self, schema=None, executor=None, middleware=None, root_value=None,
8084 self .pretty = self .pretty or pretty
8185 self .graphiql = self .graphiql or graphiql
8286 self .batch = self .batch or batch
87+ self .backend = backend
8388
8489 assert isinstance (
8590 self .schema , GraphQLSchema ), 'A Schema is required to be provided to GraphQLView.'
@@ -96,6 +101,9 @@ def get_middleware(self, request):
96101 def get_context (self , request ):
97102 return request
98103
104+ def get_backend (self , request ):
105+ return self .backend
106+
99107 @method_decorator (ensure_csrf_cookie )
100108 def dispatch (self , request , * args , ** kwargs ):
101109 try :
@@ -225,49 +233,44 @@ def parse_body(self, request):
225233
226234 return {}
227235
228- def execute (self , * args , ** kwargs ):
229- return execute (self .schema , * args , ** kwargs )
230-
231236 def execute_graphql_request (self , request , data , query , variables , operation_name , show_graphiql = False ):
232237 if not query :
233238 if show_graphiql :
234239 return None
235240 raise HttpError (HttpResponseBadRequest (
236241 'Must provide query string.' ))
237242
238- source = Source (query , name = 'GraphQL request' )
239-
240243 try :
241- document_ast = parse (source )
242- validation_errors = validate (self .schema , document_ast )
243- if validation_errors :
244- return ExecutionResult (
245- errors = validation_errors ,
246- invalid = True ,
247- )
244+ backend = self .get_backend (request )
245+ document = backend .document_from_string (self .schema , query )
248246 except Exception as e :
249247 return ExecutionResult (errors = [e ], invalid = True )
250248
251249 if request .method .lower () == 'get' :
252- operation_ast = get_operation_ast ( document_ast , operation_name )
253- if operation_ast and operation_ast . operation != 'query' :
250+ operation_type = document . get_operation_type ( operation_name )
251+ if operation_type and operation_type != 'query' :
254252 if show_graphiql :
255253 return None
256254
257255 raise HttpError (HttpResponseNotAllowed (
258256 ['POST' ], 'Can only perform a {} operation from a POST request.' .format (
259- operation_ast . operation )
257+ operation_type )
260258 ))
261259
262260 try :
263- return self .execute (
264- document_ast ,
265- root_value = self .get_root_value (request ),
266- variable_values = variables ,
261+ extra_options = {}
262+ if self .executor :
263+ # We only include it optionally since
264+ # executor is not a valid argument in all backends
265+ extra_options ['executor' ] = self .executor
266+
267+ return document .execute (
268+ root = self .get_root_value (request ),
269+ variables = variables ,
267270 operation_name = operation_name ,
268- context_value = self .get_context (request ),
271+ context = self .get_context (request ),
269272 middleware = self .get_middleware (request ),
270- executor = self . executor ,
273+ ** extra_options
271274 )
272275 except Exception as e :
273276 return ExecutionResult (errors = [e ], invalid = True )
0 commit comments