@@ -62,8 +62,10 @@ class GraphQLView(View):
6262 middleware = None
6363 root_value = None
6464 pretty = False
65+ batch = False
6566
66- def __init__ (self , schema = None , executor = None , middleware = None , root_value = None , graphiql = False , pretty = False ):
67+ def __init__ (self , schema = None , executor = None , middleware = None , root_value = None , graphiql = False , pretty = False ,
68+ batch = False ):
6769 if not schema :
6870 schema = graphene_settings .SCHEMA
6971
@@ -77,8 +79,10 @@ def __init__(self, schema=None, executor=None, middleware=None, root_value=None,
7779 self .root_value = root_value
7880 self .pretty = pretty
7981 self .graphiql = graphiql
82+ self .batch = batch
8083
8184 assert isinstance (self .schema , GraphQLSchema ), 'A Schema is required to be provided to GraphQLView.'
85+ assert not all ((graphiql , batch )), 'Use either graphiql or batch processing'
8286
8387 # noinspection PyUnusedLocal
8488 def get_root_value (self , request ):
@@ -99,32 +103,12 @@ def dispatch(self, request, *args, **kwargs):
99103 data = self .parse_body (request )
100104 show_graphiql = self .graphiql and self .can_display_graphiql (request , data )
101105
102- query , variables , operation_name = self .get_graphql_params (request , data )
103-
104- execution_result = self .execute_graphql_request (
105- request ,
106- data ,
107- query ,
108- variables ,
109- operation_name ,
110- show_graphiql
111- )
112-
113- if execution_result :
114- response = {}
115-
116- if execution_result .errors :
117- response ['errors' ] = [self .format_error (e ) for e in execution_result .errors ]
118-
119- if execution_result .invalid :
120- status_code = 400
121- else :
122- status_code = 200
123- response ['data' ] = execution_result .data
124-
125- result = self .json_encode (request , response , pretty = show_graphiql )
106+ if self .batch :
107+ responses = [self .get_response (request , entry ) for entry in data ]
108+ result = '[{}]' .format (',' .join ([response [0 ] for response in responses ]))
109+ status_code = max (responses , key = lambda response : response [1 ])[1 ]
126110 else :
127- result = None
111+ result , status_code = self . get_response ( request , data , show_graphiql )
128112
129113 if show_graphiql :
130114 return self .render_graphiql (
@@ -150,6 +134,43 @@ def dispatch(self, request, *args, **kwargs):
150134 })
151135 return response
152136
137+ def get_response (self , request , data , show_graphiql = False ):
138+ query , variables , operation_name , id = self .get_graphql_params (request , data )
139+
140+ execution_result = self .execute_graphql_request (
141+ request ,
142+ data ,
143+ query ,
144+ variables ,
145+ operation_name ,
146+ show_graphiql
147+ )
148+
149+ if execution_result :
150+ response = {}
151+
152+ if execution_result .errors :
153+ response ['errors' ] = [self .format_error (e ) for e in execution_result .errors ]
154+
155+ if execution_result .invalid :
156+ status_code = 400
157+ else :
158+ status_code = 200
159+ response ['data' ] = execution_result .data
160+
161+ if self .batch :
162+ response = {
163+ 'id' : id ,
164+ 'payload' : response ,
165+ 'status' : status_code ,
166+ }
167+
168+ result = self .json_encode (request , response , pretty = show_graphiql )
169+ else :
170+ result = None
171+
172+ return result , status_code
173+
153174 def render_graphiql (self , request , ** data ):
154175 return render (request , self .graphiql_template , data )
155176
@@ -170,7 +191,10 @@ def parse_body(self, request):
170191 elif content_type == 'application/json' :
171192 try :
172193 request_json = json .loads (request .body .decode ('utf-8' ))
173- assert isinstance (request_json , dict )
194+ if self .batch :
195+ assert isinstance (request_json , list )
196+ else :
197+ assert isinstance (request_json , dict )
174198 return request_json
175199 except :
176200 raise HttpError (HttpResponseBadRequest ('POST body sent invalid JSON.' ))
@@ -242,6 +266,7 @@ def request_wants_html(cls, request):
242266 def get_graphql_params (request , data ):
243267 query = request .GET .get ('query' ) or data .get ('query' )
244268 variables = request .GET .get ('variables' ) or data .get ('variables' )
269+ id = request .GET .get ('id' ) or data .get ('id' )
245270
246271 if variables and isinstance (variables , six .text_type ):
247272 try :
@@ -251,7 +276,7 @@ def get_graphql_params(request, data):
251276
252277 operation_name = request .GET .get ('operationName' ) or data .get ('operationName' )
253278
254- return query , variables , operation_name
279+ return query , variables , operation_name , id
255280
256281 @staticmethod
257282 def format_error (error ):
0 commit comments