石墨烯 Django "Must provide query string"

Graphene Django "Must provide query string"

我已经使用 Django 设置了一个 Graphene 服务器。当我 运行 通过 GraphiQL(网络客户端)查询时,一切正常。但是,当我从其他任何地方 运行 时,我收到错误消息:"Must provide query string."

我做了一些故障排除。 GraphiQL 使用 Content-Type: application/json 将 POST 数据发送到 GraphQL 服务器。这是我从 GraphiQL 的 Chrome 网络选项卡复制的请求正文:

{"query":"query PartnersQuery {\n  partners{\n    name\n    url\n    logo\n  }\n}","variables":"null","operationName":"PartnersQuery"}

当我使用 Content-Type: application/json 将其复制到 Postman 时,我得到以下响应:

{
  "errors": [
    {
      "message": "Must provide query string."
    }
  ]
}

导致此问题的原因是什么?我没有对模式做任何疯狂的事情。只是按照石墨烯文档中的教程进行操作。还有什么会导致这样的问题?

查看示例应用并了解它们的工作方式,

例如 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())),

parse_body 无法解析传入数据时会引发此错误。我将从查看传递到此方法的数据并确保其类型正确开始。

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

以下是我如何使用带有简单突变的石墨烯 Django 后端从 Postman 获得成功的响应:

  1. 将方法设置为 POST
  2. 将 URL 添加到您的 graphQL 端点,例如http://localhost:8000/api/
  3. 加一个header -- 键:"Content-Type",值:"application/json"
  4. 将 body 设置为 "raw"
  5. 将您的查询粘贴到 body window,例如{"query":"{myModels {id}}","variables":"null","operationName":null}

这听起来很像你所做的,所以你一定很接近。

我遇到了和楼主 Gasim 完全一样的问题。研究 'graphiql.html' 中的代码,我发现他们正在将进入 body 的查询字符串转换为 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 中的内容对我来说似乎是荒谬的,但这似乎是获得石墨烯服务器 return 有效响应。

这肯定是 bug/shortcoming 会被修复的吗?

罗伯特

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

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

正斜线是一个巨大的差异。删除它解决了问题。正确的做法是:

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

当我尝试使用 POSTMAN 使用 graphQl 查询时,我遇到了同样的问题, 在 POSTMAN 中使用 json 类型发送 row 中的数据。 您必须像这样 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

在 django 上启用 graphine

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

执行一些查询并查看它是否正常工作

在 Chrome 浏览器上,转到 graphiQL 端点:http://localhost:8000/graphql? 在浏览器中打开“Developer Tools”并转到“Network”选项卡。

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

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