Flask+GraphQL+SQLAlchemy报错:'Request'对象无'get'属性
问题原因分析
报错AttributeError: 'Request' object has no attribute 'get'的核心原因是:Graphene-SQLAlchemy的SQLAlchemyObjectType.get_query()方法默认会尝试通过info.context.get('db_session')获取数据库会话,但你的代码里info.context直接是Flask的Request对象(而非包含db_session的字典),Request对象没有字典的get()方法,因此触发错误。
而Mutations功能正常,是因为Mutations逻辑里大概率是手动调用了db.session,没有依赖get_query()的默认上下文获取逻辑。
两种解决方案
方案1:修改GraphQL视图的上下文配置
在添加GraphQL路由时,确保上下文字典中包含db_session,替代直接传递Request对象:
方法1.1:自定义上下文函数
from flask_graphql import GraphQLView def get_graphql_context(): return {"db_session": db.session} app.add_url_rule( "/graphql", view_func=GraphQLView.as_view( "graphql", schema=schema, graphiql=True, context=get_graphql_context # 传入上下文函数 ) )
方法1.2:自定义GraphQL视图类
如果需要保留Request对象同时添加db_session:
class CustomGraphQLView(GraphQLView): def get_context(self): # 获取默认上下文(包含Request对象) context = super().get_context() # 添加db_session到上下文 context["db_session"] = db.session return context app.add_url_rule( "/graphql", view_func=CustomGraphQLView.as_view( "graphql", schema=schema, graphiql=True ) )
方案2:重写UserObject的get_query方法
直接在UserObject中跳过上下文获取逻辑,手动返回数据库查询对象:
class UserObject(SQLAlchemyObjectType): class Meta: model = User interfaces = (graphene.relay.Node,) @classmethod def get_query(cls, info): # 直接使用全局的db.session创建查询 return db.session.query(cls.model)
额外注意事项
- 因为你用
automap_base自动生成模型,确保User模型已经正确绑定到db.session(即automap_base生成的类已经加入SQLAlchemy的会话管理)。 - 验证上下文传递后,测试查询时需确保没有其他会话生命周期的问题(比如请求结束后正确关闭会话)。
内容的提问来源于stack exchange,提问作者Raylo
相关产品推荐
相关产品推荐

