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
相关产品推荐
相关产品推荐

