How to validate a Pydantic model which represents a list of model instances ? #292
-
I got these models from pydantic import BaseModel
class MyModel(BaseModel):
name: str
id: int
class ListOfMyModels(BaseModel):
__root__: List[MyModel] From the docs this is the official way to instantiate a model who is a list of models However, when I try to validate this at route level I get an error: @spectree_app.validate(json=ListOfMyModels) output traceback ../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/werkzeug/test.py:1137: in put
return self.open(*args, **kw)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/flask/testing.py:220: in open
follow_redirects=follow_redirects,
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/werkzeug/test.py:1072: in open
response = self.run_wsgi_app(request.environ, buffered=buffered)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/werkzeug/test.py:943: in run_wsgi_app
rv = run_wsgi_app(self.application, environ, buffered=buffered)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/werkzeug/test.py:1229: in run_wsgi_app
app_rv = app(environ, start_response)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/flask/app.py:2088: in __call__
return self.wsgi_app(environ, start_response)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/flask/app.py:2073: in wsgi_app
response = self.handle_exception(e)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/flask/app.py:2070: in wsgi_app
response = self.full_dispatch_request()
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/flask/app.py:1515: in full_dispatch_request
rv = self.handle_user_exception(e)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/flask/app.py:1513: in full_dispatch_request
rv = self.dispatch_request()
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/flask/app.py:1499: in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/flask/views.py:83: in view
return self.dispatch_request(*args, **kwargs)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/flask/views.py:157: in dispatch_request
return meth(*args, **kwargs)
common/auth.py:97: in decorator
return func(*args, **kwargs)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/spectree/spec.py:139: in sync_validate
**kwargs,
common/spectree_app.py:51: in validate
self.request_validation(request, query, json, headers, cookies)
self = <common.spectree_app.CustomFlaskPlugin object at 0x107193408>
request = <LocalProxy unbound>, query = None
json = <class 'resources.schemas.my_models.ListOfMyModels'>
headers = None, cookies = None
def request_validation(self, request, query, json, headers, cookies):
req_query = request.args or {}
if request.mimetype in self.FORM_MIMETYPE:
req_json = request.form or {}
if request.files:
req_json = dict(
list(request.form.items()) + list(request.files.items())
)
else:
req_json = request.get_json(silent=True) or {}
req_headers = request.headers or {}
req_cookies = request.cookies or {}
request.context = Context(
query.parse_obj(req_query.items()) if query else None,
> json.parse_obj(req_json.items()) if json else None,
headers.parse_obj(req_headers.items()) if headers else None,
cookies.parse_obj(req_cookies.items()) if cookies else None,
)
E AttributeError: 'list' object has no attribute 'items' How to get rid of this ? |
Beta Was this translation helpful? Give feedback.
Replies: 4 comments 1 reply
-
Which version are you using? I think it's already supported. You can use |
Beta Was this translation helpful? Give feedback.
-
@kemingy it seems like this scenario is really broken. #222 is adding support for list in response, but the error in subject here is a list in request. I might take a look into it. |
Beta Was this translation helpful? Give feedback.
-
@kemingy : Thanks for your answer. @spectree_app.validate(json=List[MyModel]) output traceback ../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/spectree/spec.py:227: in decorate_validation
model_key = self._add_model(model=model)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/spectree/spec.py:258: in _add_model
model_key = get_model_key(model=model)
../../../../.pyenv/versions/fry5/lib/python3.7/site-packages/spectree/utils.py:244: in get_model_key
return f"{model.__name__}.{hash_module_path(module_path=model.__module__)}"
../../../../.pyenv/versions/3.7.12/lib/python3.7/typing.py:707: in __getattr__
raise AttributeError(attr)
E AttributeError: __name__ I use the last version (1.1.0) |
Beta Was this translation helpful? Give feedback.
-
@jossefaz from the traceback in first message looks like outdated version of spectree/spectree/plugins/flask_plugin.py Lines 135 to 159 in 98f2e1d |
Beta Was this translation helpful? Give feedback.
@jossefaz from the traceback in first message looks like outdated version of
request_validation()
. So either you have overriden it based on code from some older release, or the version you have installed isnt really 1.1.0. The default function has changed noticably (notice for example theform.parse_obj()
which is absent in your traceback).spectree/spectree/plugins/flask_plugin.py
Lines 135 to 159 in 98f2e1d