中间件会影响schema中字段的计算
中间件next_middleware是一个对象或者方法:resolve(next_middleware, *args)
中间件的作用:
(1)发送给resolve一个中间件继续计算
(2)结束计算
中间件resolve的四个参数:
next代表执行链。致电next继续评估。
root是在整个查询中传递的根值对象。
info是解析器信息。
args是传递给该字段的参数。
对象中间件示例:
class AuthorizationMiddleware(object):
def resolve(self, next, root, info, **args):
if info.field_name == 'user':
return None
return next(root, info, **args)
使用中间件
result = schema.execute('THE QUERY', middleware=[AuthorizationMiddleware()])
函数中间件示例:
from time import time as timer
def timing_middleware(next, root, info, **args):
start = timer()
return_value = next(root, info, **args)
duration = timer() - start
logger.debug("{parent_type}.{field_name}: {duration} ms".format(
parent_type=root._meta.name if root and hasattr(root, '_meta') else '',
field_name=info.field_name,
duration=round(duration * 1000, 2)
))
return return_value
中间件类似于一个装饰器。为resolve增加新的功能。