Graphene Django“必须提供查询字符串”

时间:2017-05-25 16:15:17

标签: django graphql graphene-python

我使用Django设置了Graphene服务器。当我通过GraphiQL(Web客户端)运行查询时,一切正常。但是,当我从其他任何地方运行时,我收到错误:“必须提供查询字符串。”

我做了一些故障排除。 GraphiQL使用String id = "0000000101%"; query.setParameter("id", id); 将POST数据发送到GraphQL服务器。以下是我从GraphiQL的Chrome网络标签中复制的请求正文:

Content-Type: application/json

当我使用{"query":"query PartnersQuery {\n partners{\n name\n url\n logo\n }\n}","variables":"null","operationName":"PartnersQuery"} 将其复制到邮递员时,我收到以下回复:

Content-Type: application/json

这个问题的原因是什么?我没有对架构做过任何疯狂的事情。刚刚接受了石墨烯文档的教程。还有什么可能导致这样的问题?

7 个答案:

答案 0 :(得分:3)

parse_body无法解析传入数据时会引发此错误。我将通过查看传入此方法的数据并确保其格式正确来启动。

例如,multipart/form-data部分天真地返回request.POST,这可能需要被覆盖以处理,例如,apollo-upload-client发送的文件上传处理请求。 在我们的例子中,我们创建了一个视图,既要求登录又支持apollo-upload-client用例,并且工作正常。

答案 1 :(得分:2)

在这里,我是如何使用带有简单变异的石墨烯Django后端从Postman获得成功的回应:

  1. 将方法设置为POST
  2. 将URL添加到graphQL端点,例如http://localhost:8000/api/
  3. 添加一个标题 - 键:"内容类型" ,值:" application / json"
  4. 将正文设置为" raw"
  5. 将查询粘贴到正文窗口,例如{"query":"{myModels {id}}","variables":"null","operationName":null}
  6. 这听起来很像你所做的,所以你一定要亲近。

答案 2 :(得分:1)

结帐示例应用并了解他们的工作方式,

e.g。 https://github.com/mjtamlyn/graphene-tutorial 他们做了以下事情:

from django.views.decorators.csrf import csrf_exempt
from graphene_django.views import GraphQLView

url(r'^explore', GraphQLView.as_view(graphiql=True)),
url(r'^graphql', csrf_exempt(GraphQLView.as_view())),

答案 3 :(得分:1)

当我尝试使用graphQl使用POSTMAN查询时,我遇到了同样的问题, 在POSTMAN中,使用row类型在json中发送数据。 你必须像这样制作json数据grapQl查询和突变数据

查询命令:

{"query":"{user(id:902){id,username,DOB}}"}

突变命令:

{ "query": "mutation {createMutations(reviewer:36, comments:\"hello\",loan: 1659, approved: true ){id}}" }

       #commnent: String Type
       #data_id:Int Type
       #approved:Boolean Type

答案 4 :(得分:0)

我遇到了与原版海报Gasim完全相同的问题。在' graphiql.html'中研究代码我看到他们正在将查询字符串(进入正文)转换为URL中的查询参数。因此,您最终会通过Postman发送此URL:

http://127.0.0.1:8000/graphql?query=%7B%0A%20%20allCategories%20%7B%0A%20%20%20%20edges%20%7B%0A%20%20%20%20%20%20node%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20ingredients%20%7B%0A%20%20%20%20%20%20%20%20%20%20edges%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20node%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A

对于我来说,在URL中的查询字符串中精确复制 body 中的内容似乎是荒谬的,但这似乎是让Graphene服务器返回的唯一方法有效的回应。

当然这是一个将被修复的错误/缺点?

罗伯特

答案 5 :(得分:0)

在Django上启用石墨烯

  url(r'^graphql', csrf_exempt(GraphQLView.as_view(graphiql=settings.DEBUG))),

执行一些查询,看看它是否有效

在Chrome浏览器上,转到 graphiQL 端点: http://localhost:8000/graphql打开“ 开发人员工具” ”,然后转到“ 网络”标签。

再次执行查询。现在,它出现在请求列表中。现在,在其上右键单击,并将其复制为“ 复制为CURL ”。现在,您可以进行海峡复制并将其粘贴到安装了curl的linux终端上。或者像您的情况一样,您可以尝试扣除其中的内容,然后尝试在IDE中重用它,例如像Insomnia或Postman这样的客户端。例如,您可能会发现与 graphiQL 上的会话一起使用的授权最终并不是您想要的...

curl 'http://localhost:8000/graphql?' -H 'Origin: http://localhost:8000' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9,pl;q=0.8,de;q=0.7' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Cookie: _ga=GA1.1.1578283610.1528109563; _gid=GA1.1.920024733.1541592686; csrftoken=EGBeegFoyMVl8j1fQbuEBG587nOFP2INwv7Q0Ee6HeHHmsLOPUwRonzun9Y6pOjV; sessionid=4u9vngcnmjh927a9avpssvc4oq9qyqoe' -H 'Connection: keep-alive' -H 'X-CSRFToken: EGBeegFoyMVl8j1fQbuEBG587nOFP2INwv7Q0Ee6HeHHmsLOPUwRonzun9Y6pOjV' --data-binary '{"query":"{\n  allStatistics(projectId: 413581, first:25) {\n    pageInfo {\n      startCursor\n      endCursor\n      hasPreviousPage\n      hasNextPage\n    }\n    edges {\n      cursor\n      node {\n        id\n        clickouts\n        commissionCanc\n        commissionConf\n        commissionLeads\n        commissionOpen\n        eventDate\n        extractTstamp\n        hash\n        leads\n        pageviews\n        projectId\n        transactionsCanc\n        transactionsConf\n        transactionsOpen\n      }\n    }\n  }\n}\n","variables":null,"operationName":null}' --compressed

答案 6 :(得分:-1)

我的代码中的问题是我为graphQL设置了不正确的URL。我有以下内容:

sendMessage

正斜杠是一个巨大的差异。删除它修复了问题。正确的方法是:

url(r'^graphql/', GraphQLView.as_view())