Skip to content

Commit ba0f218

Browse files
committed
issue#186 - allow strict mode when validating model fields
1 parent f0c08b1 commit ba0f218

2 files changed

Lines changed: 20 additions & 11 deletions

File tree

flask_restx/model.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,14 @@ class RawModel(ModelBase):
132132
133133
:param str name: The model public name
134134
:param str mask: an optional default model mask
135+
:param bool strict: validation should raise error when there is param not provided in schema
135136
"""
136137

137138
wrapper = dict
138139

139140
def __init__(self, name, *args, **kwargs):
140141
self.__mask__ = kwargs.pop("mask", None)
142+
self.__strict__ = kwargs.pop("strict", False)
141143
if self.__mask__ and not isinstance(self.__mask__, Mask):
142144
self.__mask__ = Mask(self.__mask__)
143145
super(RawModel, self).__init__(name, *args, **kwargs)
@@ -160,15 +162,18 @@ def _schema(self):
160162
if getattr(field, "discriminator", False):
161163
discriminator = name
162164

163-
return not_none(
164-
{
165-
"required": sorted(list(required)) or None,
166-
"properties": properties,
167-
"discriminator": discriminator,
168-
"x-mask": str(self.__mask__) if self.__mask__ else None,
169-
"type": "object",
170-
}
171-
)
165+
definition = {
166+
"required": sorted(list(required)) or None,
167+
"properties": properties,
168+
"discriminator": discriminator,
169+
"x-mask": str(self.__mask__) if self.__mask__ else None,
170+
"type": "object",
171+
}
172+
173+
if self.__strict__:
174+
definition['additionalProperties'] = False
175+
176+
return not_none(definition)
172177

173178
@cached_property
174179
def resolved(self):
@@ -240,6 +245,7 @@ def __deepcopy__(self, memo):
240245
self.name,
241246
[(key, copy.deepcopy(value, memo)) for key, value in iteritems(self)],
242247
mask=self.__mask__,
248+
strict=self.__strict__,
243249
)
244250
obj.__parents__ = self.__parents__
245251
return obj

flask_restx/namespace.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,17 @@ def add_model(self, name, definition):
162162
api.models[name] = definition
163163
return definition
164164

165-
def model(self, name=None, model=None, mask=None, **kwargs):
165+
def model(self, name=None, model=None, mask=None, strict=False, **kwargs):
166166
"""
167167
Register a model
168168
169+
:param bool strict - should model validation raise error when non-specified param
170+
is provided?
171+
169172
.. seealso:: :class:`Model`
170173
"""
171174
cls = OrderedModel if self.ordered else Model
172-
model = cls(name, model, mask=mask)
175+
model = cls(name, model, mask=mask, strict=strict)
173176
model.__apidoc__.update(kwargs)
174177
return self.add_model(name, model)
175178

0 commit comments

Comments
 (0)