Django中跨应用调用GraphQL查询返回None问题求助
users: None的问题 咱们先捋清楚你遇到的状况:手动在GraphiQL(或GraphQL Playground)里能正常查到数据,但通过frontend应用的API调用就返回OrderedDict([('users', None)]),这大概率是认证权限或者请求格式的问题——毕竟手动查询时你可能已经通过了认证,而API调用没带上必要的凭证。
下面是几个常见的排查方向和解决办法:
1. 检查认证凭证是否正确传递
如果你的GraphQL schema设置了认证要求(比如用了graphql_jwt的装饰器或权限类),API调用时必须带上对应凭证:
情况一:JWT认证场景
确保frontend调用时,请求头里带上Authorization: JWT <你的token>。比如用Python的requests库实现:
import requests headers = { 'Authorization': 'JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...', 'Content-Type': 'application/json' } query = """ query { users { id username } } """ response = requests.post('http://localhost:8000/graphql/', json={'query': query}, headers=headers) print(response.json())
情况二:Session认证场景(同项目内调用)
如果frontend和api在同一个Django项目下,要确保请求带上session cookie,比如用requests的会话对象:
session = requests.Session() # 先登录获取有效session session.post('http://localhost:8000/api/login/', data={'username': '你的用户名', 'password': '你的密码'}) # 再发起GraphQL查询 response = session.post('http://localhost:8000/graphql/', json={'query': query}) print(response.json())
2. 检查Schema中的权限逻辑
打开你的api/schema.py,看看users字段的resolver有没有权限限制逻辑:
from graphene_django import DjangoObjectType from django.contrib.auth.models import User class UserType(DjangoObjectType): class Meta: model = User fields = ("id", "username", "email") class Query(graphene.ObjectType): users = graphene.List(UserType) def resolve_users(self, info, **kwargs): # 这里的权限判断可能导致返回None if not info.context.user.is_authenticated or not info.context.user.has_perm('auth.view_user'): return None return User.objects.all()
如果resolver里有类似的判断,而API调用的用户未通过认证/没有对应权限,就会返回None。你可以临时注释权限逻辑测试是否能返回数据,再调整权限规则。
3. 确认请求格式是否正确
确保frontend发送的是POST请求,且请求体是application/json格式,query字段是合法的GraphQL查询字符串:
- 正确的请求体示例:
{ "query": "query { users { id username } }" }
避免用GET方法或form-data格式的请求体,这两种方式都可能导致GraphQL解析失败。
4. 调试Resolver函数定位问题
在resolve_users里加打印语句,查看请求上下文和查询状态:
def resolve_users(self, info, **kwargs): print("当前请求用户:", info.context.user) print("用户是否已认证:", info.context.user.is_authenticated) try: users = User.objects.all() print("查询到的用户数量:", users.count()) return users except Exception as e: print("查询出错:", str(e)) return None
运行Django服务器后发起API调用,通过控制台输出就能快速定位是用户未认证、权限不足还是查询本身出错。
内容的提问来源于stack exchange,提问作者Victor Guegan

