graphene-python学习笔记(12)DataLoader

DataLoader是一个可用作应用程序数据提取的一部分,通过批处理和缓存在各种远程数据源(如数据库或Web服务)上提供简化且一致的API。用于防止出现多次请求。

1、批处理

示例:

from promise import Promise
from promise.dataloader import DataLoader

class UserLoader(DataLoader):
    def batch_load_fn(self, keys):
        # Here we return a promise that will result on the
        # corresponding user for each key in keys
        return Promise.resolve([get_user(id=key) for key in keys])

  使用UserLoader

user_loader = UserLoader()

user_loader.load(1).then(lambda user: user_loader.load(user.best_friend_id))

user_loader.load(2).then(lambda user: user_loader.load(user.best_friend_id))

  一般的请求会发送四次,但是UserLoade最多发送两次,DataLoader可以合并请求。减少请求次数。

2、Using with Graphene

{
  me {
    name
    bestFriend {
      name
    }
    friends(first: 5) {
      name
      bestFriend {
        name
      }
    }
  }
}

  如果直接请求,上面的请求可能会发生13次,但是使用user_loader

class User(graphene.ObjectType):
    name = graphene.String()
    best_friend = graphene.Field(lambda: User)
    friends = graphene.List(lambda: User)

    def resolve_best_friend(self, info):
        return user_loader.load(self.best_friend_id)

    def resolve_friends(self, info):
        return user_loader.load_many(self.friend_ids)

  最多请求4次。

posted @ 2018-08-30 15:15  tutu_python  阅读(549)  评论(0)    收藏  举报