You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中跨应用调用GraphQL查询返回None问题求助

解决Django GraphQL API调用返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:58:53