QueryDepthLimiter
#
This extension adds a validator to limit the query depth of GraphQL operations.
Usage example:#
import strawberry
from strawberry.extensions import QueryDepthLimiter
schema = strawberry.Schema(
Query,
extensions=[
QueryDepthLimiter(max_depth=10),
],
)
API reference:#
class QueryDepthLimiter(max_depth, ignore=None, callback=None):
...
max_depth: int
#
The maximum allowed depth for any operation in a GraphQL document.
ignore: Optional[List[IgnoreType]]
#
Stops recursive depth checking based on a field name. Either a string or regexp to match the name, or a function that returns a boolean.
callback: Optional[Callable[[Dict[str, int]], None]
#
Called each time validation runs. Receives a dictionary which is a map of the depths for each operation.
More examples:#
Ignoring fields
import strawberry
from strawberry.extensions import QueryDepthLimiter
schema = strawberry.Schema(
Query,
extensions=[
QueryDepthLimiter(max_depth=2, ignore=["user"]),
],
)
# This query fails
schema.execute(
"""
query TooDeep {
book {
author {
publishedBooks {
title
}
}
}
}
"""
)
# This query succeeds because the `user` field is ignored
schema.execute(
"""
query NotTooDeep {
user {
favouriteBooks {
author {
publishedBooks {
title
}
}
}
}
}
"""
)
Ignoring fields with regex
import re
import strawberry
from strawberry.extensions import QueryDepthLimiter
schema = strawberry.Schema(
Query,
extensions=[
QueryDepthLimiter(max_depth=2, ignore=[re.compile(r".*favourite.*")]),
],
)
# This query succeeds because an field that contains `favourite` is ignored
schema.execute(
"""
query NotTooDeep {
user {
favouriteBooks {
author {
publishedBooks {
title
}
}
}
}
}
"""
)
Ignoring fields with a function
import strawberry
from strawberry.extensions import QueryDepthLimiter
schema = strawberry.Schema(
Query,
extensions=[
QueryDepthLimiter(
max_depth=2, ignore=[lambda field_name: field_name == "user"]
),
],
)
schema.execute(
"""
query NotTooDeep {
user {
favouriteBooks {
author {
publishedBooks {
title
}
}
}
}
}
"""
)