[Bug]Post json string array with pydantic error
Jenuce opened this issue · comments
Environment (please complete the following information):
- OS: any
- Browser any
- Version 23.3.0
Describe the bug
ex:
curl --location --request POST 'http://127.0.0.1:8080/testarray'
--header 'Content-Type: application/json'
--data-raw '[ "dog","cat"]'
the pydantic example:
https://docs.pydantic.dev/latest/usage/models/ Custom Root Types
class Pets(BaseModel):
__root__: List[str]
class Controller(HTTPMethodView):
@validate(json=Pets)
async def post(self, req: request.Request, body: Pets):
return json({})
Expected behavior
sanic_ext.exceptions.ValidationError: Invalid request body: EncryptVO. Error: ModelMetaclass object argument after ** must be a mapping, not list
Additional context
how to fix:
- extra/validation/validators.py line 33
[old]
def _validate_instance(model, body, allow_coerce):
data = clean_data(model, body) if allow_coerce else body
return model(**data)
[new]
def _validate_instance(model, body, allow_coerce):
data = clean_data(model, body) if allow_coerce else body
from sanic_ext.utils.typing import is_pydantic
if is_pydantic(model) and isinstance(body,list):
return model.parse_obj(body)
return model(**data)
2.extensions/openapi/types.py line 301
[old]
if is_pydantic(value):
try:
value = value.__pydantic_model__
except AttributeError:
...
extra = value.schema()["properties"]
[new]
if is_pydantic(value):
try:
value = value.__pydantic_model__
except AttributeError:
...
value_schema = value.schema()
if "properties" in value_schema:
extra = value_schema["properties"]
else:
extra = value_schema
Can you add some code formatting so it is easier to read?