@@ -62,8 +62,10 @@ class GraphQLView(View):
62
62
middleware = None
63
63
root_value = None
64
64
pretty = False
65
+ batch = False
65
66
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 ):
67
69
if not schema :
68
70
schema = graphene_settings .SCHEMA
69
71
@@ -77,8 +79,10 @@ def __init__(self, schema=None, executor=None, middleware=None, root_value=None,
77
79
self .root_value = root_value
78
80
self .pretty = pretty
79
81
self .graphiql = graphiql
82
+ self .batch = batch
80
83
81
84
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'
82
86
83
87
# noinspection PyUnusedLocal
84
88
def get_root_value (self , request ):
@@ -99,32 +103,12 @@ def dispatch(self, request, *args, **kwargs):
99
103
data = self .parse_body (request )
100
104
show_graphiql = self .graphiql and self .can_display_graphiql (request , data )
101
105
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 ]
126
110
else :
127
- result = None
111
+ result , status_code = self . get_response ( request , data , show_graphiql )
128
112
129
113
if show_graphiql :
130
114
return self .render_graphiql (
@@ -150,6 +134,43 @@ def dispatch(self, request, *args, **kwargs):
150
134
})
151
135
return response
152
136
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
+
153
174
def render_graphiql (self , request , ** data ):
154
175
return render (request , self .graphiql_template , data )
155
176
@@ -170,7 +191,10 @@ def parse_body(self, request):
170
191
elif content_type == 'application/json' :
171
192
try :
172
193
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 )
174
198
return request_json
175
199
except :
176
200
raise HttpError (HttpResponseBadRequest ('POST body sent invalid JSON.' ))
@@ -242,6 +266,7 @@ def request_wants_html(cls, request):
242
266
def get_graphql_params (request , data ):
243
267
query = request .GET .get ('query' ) or data .get ('query' )
244
268
variables = request .GET .get ('variables' ) or data .get ('variables' )
269
+ id = request .GET .get ('id' ) or data .get ('id' )
245
270
246
271
if variables and isinstance (variables , six .text_type ):
247
272
try :
@@ -251,7 +276,7 @@ def get_graphql_params(request, data):
251
276
252
277
operation_name = request .GET .get ('operationName' ) or data .get ('operationName' )
253
278
254
- return query , variables , operation_name
279
+ return query , variables , operation_name , id
255
280
256
281
@staticmethod
257
282
def format_error (error ):
0 commit comments