mirror of
https://github.com/graphql-python/graphene.git
synced 2025-07-24 23:09:46 +03:00
Merge 77a588a5b1
into 5c4db65cc0
This commit is contained in:
commit
c77fad4525
|
@ -1,67 +1,16 @@
|
|||
import json
|
||||
|
||||
from django.conf import settings
|
||||
from django.http import HttpResponse
|
||||
from django.views.generic import View
|
||||
|
||||
from graphql.core.error import GraphQLError, format_error
|
||||
from graphql_django_view import GraphQLView as BaseGraphQLView
|
||||
|
||||
|
||||
def form_error(error):
|
||||
if isinstance(error, GraphQLError):
|
||||
return format_error(error)
|
||||
return error
|
||||
class GraphQLView(BaseGraphQLView):
|
||||
graphene_schema = None
|
||||
|
||||
def __init__(self, schema, **kwargs):
|
||||
super(GraphQLView, self).__init__(
|
||||
graphene_schema=schema,
|
||||
schema=schema.schema,
|
||||
executor=schema.executor,
|
||||
**kwargs
|
||||
)
|
||||
|
||||
class GraphQLView(View):
|
||||
schema = None
|
||||
|
||||
@staticmethod
|
||||
def format_result(result):
|
||||
data = {'data': result.data}
|
||||
if result.errors:
|
||||
data['errors'] = list(map(form_error, result.errors))
|
||||
|
||||
return data
|
||||
|
||||
def response_errors(self, *errors):
|
||||
errors = [{
|
||||
"message": str(e)
|
||||
} for e in errors]
|
||||
return HttpResponse(json.dumps({'errors': errors}), content_type='application/json')
|
||||
|
||||
def execute_query(self, request, query, *args, **kwargs):
|
||||
if not query:
|
||||
return self.response_errors(Exception("Must provide query string."))
|
||||
else:
|
||||
try:
|
||||
result = self.schema.execute(query, *args, **kwargs)
|
||||
data = self.format_result(result)
|
||||
except Exception as e:
|
||||
if settings.DEBUG:
|
||||
raise e
|
||||
return self.response_errors(e)
|
||||
return HttpResponse(json.dumps(data), content_type='application/json')
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
query = request.GET.get('query')
|
||||
return self.execute_query(request, query or '')
|
||||
|
||||
@staticmethod
|
||||
def get_content_type(request):
|
||||
meta = request.META
|
||||
return meta.get('CONTENT_TYPE', meta.get('HTTP_CONTENT_TYPE', ''))
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
content_type = self.get_content_type(request)
|
||||
if content_type == 'application/json':
|
||||
try:
|
||||
received_json_data = json.loads(request.body.decode())
|
||||
query = received_json_data.get('query')
|
||||
except ValueError:
|
||||
return self.response_errors(ValueError("Malformed json body in the post data"))
|
||||
elif content_type == 'application/graphql':
|
||||
query = request.body.decode()
|
||||
else:
|
||||
query = request.POST.get('query') or request.GET.get('query')
|
||||
return self.execute_query(request, query or '')
|
||||
def get_root_value(self, request):
|
||||
return self.graphene_schema.query(super(GraphQLView, self).get_root_value(request))
|
||||
|
|
3
setup.py
3
setup.py
|
@ -56,7 +56,7 @@ setup(
|
|||
install_requires=[
|
||||
'six>=1.10.0',
|
||||
'blinker',
|
||||
'graphql-core==0.4.7b0',
|
||||
'graphql-core==0.4.7b2',
|
||||
'graphql-relay==0.3.3'
|
||||
],
|
||||
tests_require=[
|
||||
|
@ -67,6 +67,7 @@ setup(
|
|||
'django': [
|
||||
'Django>=1.6.0,<1.9',
|
||||
'singledispatch>=3.4.0.3',
|
||||
'graphql-django-view>=1.0.0',
|
||||
],
|
||||
},
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ def test_client_post_malformed_json(settings, client):
|
|||
response = client.post('/graphql', 'MALFORMED', 'application/json')
|
||||
json_response = format_response(response)
|
||||
assert json_response == {'errors': [
|
||||
{'message': 'Malformed json body in the post data'}]}
|
||||
{'message': 'POST body sent invalid JSON.'}]}
|
||||
|
||||
|
||||
def test_client_post_empty_query_json(settings, client):
|
||||
|
|
Loading…
Reference in New Issue
Block a user