首页 文章

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

提问于
浏览
3

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

我做了一些故障排除 . 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 将其复制到邮递员时,我收到以下回复:

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

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

7 回答

  • 2

    结帐示例应用,看看他们是如何做的,

    例如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

    parse_body 无法解析传入数据时,会引发此错误 . 我是'd start there by looking at the data passed into this method and ensuring it'的正确类型 .

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

  • 1

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

    • 将方法设置为POST

    • 将URL添加到graphQL endpoints ,例如http://localhost:8000/api/

    • 添加一个 Headers - 键:"Content-Type",值:"application/json"

    • 将正文设置为"raw"

    • 将查询粘贴到正文窗口中,例如 {"query":"{myModels {id}}","variables":"null","operationName":null}

    这听起来很像你所做的,所以你必须接近 .

  • 0

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

    Query Command:

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

    Mutations Command:

    { "query": "mutation {createMutations(reviewer:36, comments:\"hello\",loan: 1659, approved: true ){id}}" }
    
           #commnent: String Type
           #data_id:Int Type
           #approved:Boolean Type
    
  • -1

    我遇到了与原版海报Gasim完全相同的问题 . 研究'graphiql.html'中的代码我发现他们正在将查询字符串(进入正文)转换为URL中的查询参数 . 因此,您最终通过邮递员发送此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中的查询字符串中精确复制正文中的内容似乎是荒谬的,但这似乎是让Graphene服务器返回有效响应的唯一方法 .

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

    罗伯特

  • 0

    在django上启用graphine

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

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

    在Chrome浏览器上,转到 graphiQL endpoints : http://localhost:8000/graphql? 打开“ Developer Tools " in browser and go to " Network ”标签 .

    再次执行您的查询 . 现在它出现在请求列表中 . 现在 right mouse click 就可以了,并将其复制为“ copy as CURL ” . 现在你可以将strait复制粘贴到安装了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
    
  • 1

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

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

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

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

相关问题