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

Django中使用Graphene-JWT时未生成Session的技术问询

嘿,我之前也碰到过一模一样的情况!其实这是graphql_jwt的设计特性导致的,咱们一步步理清楚:

为什么Session表里没有数据?

graphql_jwt是无状态的身份验证方案,它完全基于JWT令牌来处理用户身份,和Django原生的Session机制是相互独立的。当你调用tokenAuth生成有效令牌后,后续的身份验证只需要在请求头里携带这个JWT即可,不会触发Django的Session创建流程——所以Session.objects.all()始终为空是正常的,不是bug。

如果确实需要同时生成Session(比如兼容旧功能)

要是你的项目里还有依赖Django Session的视图、中间件或者第三方库,必须要在获取JWT的同时创建Session,可以通过自定义Mutation来实现:

import graphql_jwt
from django.contrib.auth import login

class ObtainJSONWebTokenWithSession(graphql_jwt.ObtainJSONWebToken):
    @classmethod
    def mutate(cls, root, info, **kwargs):
        # 先执行原生的JWT生成逻辑
        response = super().mutate(root, info, **kwargs)
        # 手动调用Django的login方法创建Session
        user = info.context.user
        if user.is_authenticated:
            login(info.context, user)
        return response

class Mutations(graphene.ObjectType):
    token_auth = ObtainJSONWebTokenWithSession.Field()
    verify_token = graphql_jwt.Verify.Field()
    refresh_token = graphql_jwt.Refresh.Field()

这段代码的核心是继承原有的ObtainJSONWebToken类,在完成JWT生成的逻辑后,调用Django内置的login()方法——这个方法会自动创建并保存Session到数据库里。修改后再调用tokenAuth,你就能在Session.objects.all()里看到对应的记录了。

额外要检查的点
  • 确保你的Django项目已经启用了Session中间件:django.contrib.sessions.middleware.SessionMiddleware必须存在于settings.py的MIDDLEWARE列表中,否则login()方法也无法创建Session。
  • 如果你不需要兼容Session相关的功能,那完全不用纠结这个问题——JWT的优势就是摆脱Session的依赖,实现无状态的身份验证,这正是它的设计初衷。

内容的提问来源于stack exchange,提问作者Freddy Martinez Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:27:40