Flask集成graphene与py2neo:Query类/resolver无法使用变量
问题解决方案
根源分析
你遇到的错误是版本兼容性问题:Graphene 3.x 依赖的 graphql-core 最低版本为 3.2.0,但你指定了 graphql-core==3.1.0。graphql-core 3.1.0 的 GraphQLArgument 构造函数不支持 deprecation_reason 参数,而 Graphene 3.x 会自动传递该参数,导致初始化报错。
解决方案
方案一:升级依赖版本(推荐)
修改你的依赖配置,将 graphql-core 版本提升至 3.2.0 及以上:
# requirements.txt Flask==2.2.3 graphene>=3.0 py2neo==2021.2.3 graphql-server[flask] graphql-core>=3.2.0
重新构建 Docker 容器,让依赖重新安装即可。
方案二:兼容旧版本的参数定义(不推荐,仅临时使用)
如果无法升级 graphql-core,可以显式使用 graphene.Argument 定义查询参数,避免自动生成 deprecation_reason 参数:
class Query(graphene.ObjectType): hello = graphene.String(description='A typical hello world') # 显式使用 Argument 定义参数 movie = graphene.Field(lambda: MovieSchema, title=graphene.Argument(graphene.String)) def resolve_hello(self, info): return 'World' def resolve_movie(self, info, title): movie = Movie.fetch(title=title) # 将 py2neo 实例转换为 Graphene Schema 对象 return MovieSchema(id=str(movie.id), title=movie.title, year=movie.year) if movie else None
额外修正(潜在问题)
你当前的代码还有两个需要修正的问题:
- py2neo OGM 模型错误使用 Graphene 类型:
py2neo 的模型属性应该用 py2neo 自带的Property定义,而非 Graphene 类型,修正后:from py2neo.ogm import Property, RelatedFrom class Movie(BaseModel): __primarykey__='title' id = Property() title = Property() year = Property() persons = RelatedFrom("Person", "ACTED_IN") def as_dict(self): return { 'id': self.id, 'title': self.title, 'year': self.year, } @classmethod def fetch(cls, title): return cls.match(graph, title).first() fetch方法需改为类方法:
你调用的是Movie.fetch(title=title),但原方法是实例方法,必须添加@classmethod装饰器才能正常调用。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

