Django 中的 GraphQL 查询返回 None
GraphQL queries in Django returning None
我正在尝试在 Django 中使用 graphQL 查询。基本上我有两个应用程序,我的 'api' 应用程序包含我进行查询所需的一切,另一个名为 'frontend' 的应用程序,我从中调用 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'
除非您正在编写测试客户端,否则您可能应该不 从 Django 视图内部调用 schema.execute
。但是假设你有这样做的理由,你的具体问题是你在 accueil
视图中调用 schema.execute
时没有传递用户。
看看 execute documentation,您会发现您需要为上下文提供一个可选参数。您的代码未提供上下文,因此根据您的例外,info.context
是 None
。不幸的是,例子
result = schema.execute('{ name }', context_value={'name': 'Syrus'})
不是特定于 Django 的。但我认为在 Django 功能视图中有效的是:
result = schema.execute(query, context_value=request)
我正在尝试在 Django 中使用 graphQL 查询。基本上我有两个应用程序,我的 'api' 应用程序包含我进行查询所需的一切,另一个名为 'frontend' 的应用程序,我从中调用 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'
除非您正在编写测试客户端,否则您可能应该不 从 Django 视图内部调用 schema.execute
。但是假设你有这样做的理由,你的具体问题是你在 accueil
视图中调用 schema.execute
时没有传递用户。
看看 execute documentation,您会发现您需要为上下文提供一个可选参数。您的代码未提供上下文,因此根据您的例外,info.context
是 None
。不幸的是,例子
result = schema.execute('{ name }', context_value={'name': 'Syrus'})
不是特定于 Django 的。但我认为在 Django 功能视图中有效的是:
result = schema.execute(query, context_value=request)