miss85246/sanic-dantic

Can't parse top-level lists

Closed this issue · 1 comments

@parse_params is unable to parse top-level lists, like:

@parse_params(path=List[str])
@parse_params(path=List[Person])

Stacktrace:

Traceback (most recent call last):
  File "/home/gr3q/Repos/maintenance-webserver/venv/lib/python3.9/site-packages/sanic/app.py", line 914, in handle_request
    response = await response
  File "/home/gr3q/Repos/maintenance-webserver/venv/lib/python3.9/site-packages/sanic_dantic/sanic_function_dantic.py", line 35, in decorated_function
    model_obj = DanticModelObj(header=header, path=path, query=query, form=form, body=body)
  File "/home/gr3q/Repos/maintenance-webserver/venv/lib/python3.9/site-packages/sanic_dantic/basic_definition.py", line 30, in __init__
    basemodel_check = [BaseModel in [_ for _ in getmro(model)] for model in self.items.values() if model]
  File "/home/gr3q/Repos/maintenance-webserver/venv/lib/python3.9/site-packages/sanic_dantic/basic_definition.py", line 30, in <listcomp>
    basemodel_check = [BaseModel in [_ for _ in getmro(model)] for model in self.items.values() if model]
  File "/usr/lib/python3.9/inspect.py", line 490, in getmro
    return cls.__mro__
  File "/usr/lib/python3.9/typing.py", line 688, in __getattr__
    raise AttributeError(attr)
AttributeError: __mro__

well, you need define a new class which is inheritance from sanic_dantic.BaseModel. like this:

from​ ​sanic​ ​import​ ​Sanic​
​from​ ​sanic​.​response​ ​import​ ​json​

​from​ ​sanic_dantic​ ​import​ ​parse_params​, ​BaseModel​


​class​ ​Person​(​BaseModel​):
    ​name​: ​str​
    ​age​: ​int​


​app​ ​=​ ​Sanic​(​"SanicDanticExample"​)

​@​app​.​route​(​'/example'​)​
​@​parse_params​(​path=Person​)​
async​ ​def​ ​path_param_examples​(​request​, ​params​):
    ​print​( ​params​.​ctx​.​name​, ​params​.​ctx​.​age​)
    ​return​ ​json​({​"message"​: ​f"hello ​{​params​.​name​}​ are you ​{​params​.​age​}​ years old ?"​})

@Greg-NetDuma