Django 中的 GraphQL 查询返回 None

Posted

技术标签:

【中文标题】Django 中的 GraphQL 查询返回 None【英文标题】:GraphQL queries in Django returning None 【发布时间】:2018-09-29 19:59:56 【问题描述】:

我正在尝试在 django 中使用 graphQL 查询。基本上我有两个应用程序,我的“api”应用程序包含进行查询所需的一切,另一个称为“前端”,我从中调用 api 来使用这些查询。

我可以使用 GraphQL 视图在其中输入查询,它运行良好,但每当我尝试进行查询时,我都会得到:“OrderedDict([('users', None)])”

Result of my query in the GraphQl view

代码:

在“api”中我的 schema.py

import graphene
import graphql_jwt
from graphene import relay, ObjectType, AbstractType, List, String, Field,InputObjectType
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from datetime import date, datetime
from django.contrib.auth.models import User
from django.contrib.auth import get_user_model

....

class Query(graphene.ObjectType):
    me = graphene.Field(UserType)
    users = graphene.List(UserType)
    profile = relay.Node.Field(ProfileNode)
    all_profiles = DjangoFilterConnectionField(ProfileNode)

    def resolve_users(self, info):
        ### Returns all users ###
        user = info.context.user
        if user.is_anonymous:
            raise Exception('Not logged!')
        if not user.is_superuser:
            raise Exception('premission denied')
        return User.objects.all()

    def resolve_me(self, info):
        ### Returns logged user ###
        user = info.context.user
        if user.is_anonymous:
            raise Exception('Not logged!')
        return user

    def resolve_all_profiles(self, info, **kwargs):
        ### Returns all profiles ###
        return Profile.objects.all()

.....

def execute(my_query):
    schema = graphene.Schema(query=Query)
    return schema.execute(my_query)

以及在我的应用前端调用应用“api”的 views.py

from django.shortcuts import render
import graphene
from api import schema
from django.contrib.auth import authenticate


def accueil(request):

    if request.user.is_authenticated:
        check = "I am logged"
    else:
        check = "I am not logged"

    result = schema.execute("""query 
                                users 
                                    id
                                    username
                                
                            """)

    return render(request, 'frontend/accueil.html', 'result' : result.data, 'check' : check)

模板:

<h1>OTC</h1>
<p> the users are : result</p>
<br/>
<p>check</p>
<a href="%url 'login'  %">login</a>
<a href="%url 'logout' %">logout</a>

最后:

The web page result

以及控制台中的错误:

An error occurred while resolving field Query.users
Traceback (most recent call last):
  File "/home/victor/myenv/lib/python3.5/site-packages/graphql/execution/executor.py", line 311, in resolve_or_error
    return executor.execute(resolve_fn, source, info, **args)
  File "/home/victor/myenv/lib/python3.5/site-packages/graphql/execution/executors/sync.py", line 7, in execute
    return fn(*args, **kwargs)
  File "/home/victor/poc2/poc2/api/schema.py", line 67, in resolve_users
    user = info.context.user
AttributeError: 'NoneType' object has no attribute 'user'
Traceback (most recent call last):
  File "/home/victor/myenv/lib/python3.5/site-packages/graphql/execution/executor.py", line 330, in complete_value_catching_error
    exe_context, return_type, field_asts, info, result)
  File "/home/victor/myenv/lib/python3.5/site-packages/graphql/execution/executor.py", line 383, in complete_value
    raise GraphQLLocatedError(field_asts, original_error=result)
graphql.error.located_error.GraphQLLocatedError: 'NoneType' object has no attribute 'user'

【问题讨论】:

你在 resolve_users 中作为 info 传递了什么? 为什么要从内部 Django 视图进行 graphQL 查询? @kartikmaji 方法 resolve_* 由调用自动调用 Query ,所以它是通过 info 的 Query 类我不处理它 @MarkChackerian graphQL 查询是在 api.schema.execute() 中进行的,我只是在视图中传递查询字符串 【参考方案1】:

除非您正在编写测试客户端,否则您可能应该从 Django 视图中调用 schema.execute。但是假设您有这样做的理由,您的具体问题是当您在 accueil 视图中调用 schema.execute 时,您没有传递用户。

查看execute documentation,您会发现您需要为上下文提供一个可选参数。您的代码没有提供上下文,因此根据您的例外情况,info.contextNone。不幸的是,这个例子

result = schema.execute(' name ', context_value='name': 'Syrus')

不是 Django 特定的。但我认为在 Django 功能视图中起作用的是:

result = schema.execute(query, context_value=request)

【讨论】:

哦,博伊,就是这样,非常感谢老兄! (是的,我正在编写一个测试客户端;))

以上是关于Django 中的 GraphQL 查询返回 None的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL graphene-django 基本使用文档

graphene_django 源码走读

GraphQL 查询从 JSON 数据源返回 GraphiQL 和 App 中的空对象

Graphql 查询总是返回 null

/graphql 处的 Django ImportError

Laravel 中的 Graphql 查询对象