石墨烯 - GraphQL:“请求”对象没有属性“上下文”

Posted

技术标签:

【中文标题】石墨烯 - GraphQL:“请求”对象没有属性“上下文”【英文标题】:Graphene - GraphQL : 'Request' object has no attribute 'context' 【发布时间】:2018-07-06 19:38:15 【问题描述】:

我正在开发一个简单的 GraphQL Flask API,并且我正在实现一个简单的查找用户解析器。这是我的schema.py

import graphene
from graphene import relay
from graphene_sqlalchemy import SQLAlchemyObjectType, SQLAlchemyConnectionField
from models import db_session, Users as UsersModel, Channel as ChannelModel, Video as VideoModel

class Users(SQLAlchemyObjectType):
    class Meta:
        model = UsersModel
        interfaces = (relay.Node, )

class Channel(SQLAlchemyObjectType):
    class Meta:
        model = ChannelModel
        interfaces = (relay.Node, )

class Query(graphene.ObjectType):
    node = relay.Node.Field()
    users = SQLAlchemyConnectionField(Users)
    find_user = graphene.Field(Users, name = graphene.String())
    all_user = SQLAlchemyConnectionField(Users)

    def resolve_find_user(self, args, context, info):
        query = Users.get_query(context)
        name = args.get('name')
        return query.get(name)

我正在使用graphene 2.0,代码返回"message": "resolve_find_user() got an unexpected keyword argument 'name'", 的错误经过一些谷歌搜索,看起来这是graphene 中的major change,它改变了解析器的工作方式。

我浏览了UPGRADE-v2.0.md 并相应地进行了更改。解析器现在看起来像这样。

# def resolve_find_user(self, info, name):
#     query = Users.get_query(info.context)
#     return query.get(name)

现在,关键字参数消失了,但我遇到了一个新问题。错误是"message": "'Request' object has no attribute 'context'",。现在我很困惑,因为我认为info.context 应该有效,但显然不是。关于如何解决这个上下文问题的任何想法?这是我第一次使用 GraphQL,非常感谢任何帮助!

编辑:看起来type(info)<class 'graphql.execution.base.ResolveInfo'>type(info.context)<class 'werkzeug.local.LocalProxy'>context 应该是 SQLAlchemy 上下文吗?

【问题讨论】:

您的代码似乎应该可以工作。 type(info.context)type(info) 是什么? 是的,我更新了我的帖子。我知道SQLAlchemy 对它的上下文可能非常挑剔。 info.context 是否应该与此相关? 我没有将它与 Flask 一起使用,但我检查了我的 Django 类型以进行比较。 type(info)<class 'graphql.execution.base.ResolveInfo'>type(info.context)<class 'django.core.handlers.wsgi.WSGIRequest'>。我不认为上下文应该与 SQLAlchemy 相关——它应该是 Flask 中 HTTP 请求的表示,不管是什么。 【参考方案1】:

在石墨烯 2.0 版中,您的解决方案将是这样的

def resolve_find_user(self, info, name):
  query = Users.get_query(info)
  return query.filter(UsersModel.name == name).first()

更多信息here

【讨论】:

以上是关于石墨烯 - GraphQL:“请求”对象没有属性“上下文”的主要内容,如果未能解决你的问题,请参考以下文章

具有外键关系的对象的石墨烯中的 GraphQL 突变

Python GraphQL 如何声明一个自引用的石墨烯对象类型

使用 GraphQL + 石墨烯进行删除操作的最佳方法

如何允许石墨烯GraphQl中的任何字段过滤

使用石墨烯和 SQLalchemy 为 GraphQL 设置权限很热门

将 json 转换为石墨烯 graphql 响应