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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:47:05