File: add-validation-rules.md

package info (click to toggle)
strawberry-graphql 0.306.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 18,176 kB
  • sloc: javascript: 178,052; python: 65,643; sh: 33; makefile: 25
file content (139 lines) | stat: -rw-r--r-- 2,656 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
---
title: Add Validation Rules
summary: Add GraphQL validation rules.
tags: validation,security
---

# `AddValidationRules`

This extension allows you add custom validation rules.

See
[graphql.validation.rules.custom](https://github.com/graphql-python/graphql-core/tree/main/src/graphql/validation/rules/custom)
for some custom rules that can be added from GraphQl-core.

## Usage example:

```python
import strawberry
from strawberry.extensions import AddValidationRules
from graphql import ValidationRule


@strawberry.type
class Query:
    @strawberry.field
    def hello(self) -> str:
        return "Hello, world!"


class MyCustomRule(ValidationRule): ...


schema = strawberry.Schema(
    Query,
    extensions=[
        AddValidationRules(MyCustomRule),
    ],
)
```

## API reference:

```python
class AddValidationRules(validation_rules): ...
```

#### `validation_rules: List[Type[ASTValidationRule]]`

List of GraphQL validation rules.

## More examples:

<details>
  <summary>Adding a custom rule</summary>

```python
import strawberry
from strawberry.extensions import AddValidationRules
from graphql import ValidationRule


@strawberry.type
class Query:
    @strawberry.field
    def hello(self) -> str:
        return "Hello, world!"


class CustomRule(ValidationRule):
    def enter_field(self, node, *args) -> None:
        if node.name.value == "example":
            self.report_error(GraphQLError("Can't query field 'example'"))


schema = strawberry.Schema(
    Query,
    extensions=[
        AddValidationRules([CustomRule]),
    ],
)

result = schema.execute_sync("{ example }")

assert str(result.errors[0]) == "Can't query field 'example'"
```

</details>

<details>
  <summary>Adding the `NoDeprecatedCustomRule` from GraphQL-core</summary>

```python
import strawberry
from strawberry.extensions import AddValidationRules
from graphql.validation import NoDeprecatedCustomRule


@strawberry.type
class Query:
    @strawberry.field
    def hello(self) -> str:
        return "Hello, world!"


schema = strawberry.Schema(
    Query,
    extensions=[
        AddValidationRules([NoDeprecatedCustomRule]),
    ],
)
```

</details>

<details>
  <summary>Adding the `NoSchemaIntrospectionCustomRule` from GraphQL-core</summary>

```python
import strawberry
from strawberry.extensions import AddValidationRules
from graphql.validation import NoSchemaIntrospectionCustomRule


@strawberry.type
class Query:
    @strawberry.field
    def hello(self) -> str:
        return "Hello, world!"


schema = strawberry.Schema(
    Query,
    extensions=[
        AddValidationRules([NoSchemaIntrospectionCustomRule]),
    ],
)
```

</details>