Browse Source

Fix tests for aliases with Pydantic V2

pull/14293/head
Yurii Motov 9 months ago
parent
commit
fbb6e1f862
  1. 0
      tests/test_aliases/__init__.py
  2. 77
      tests/test_aliases/test_file_field_aliases.py
  3. 65
      tests/test_aliases/test_form_field_aliases.py
  4. 91
      tests/test_aliases/test_form_model_aliases.py

0
tests/test_aliases/__init__.py

77
tests/test_aliases/test_file_field_aliases.py

@ -1,16 +1,20 @@
from typing import Optional
from typing import List, Optional
import pytest
from dirty_equals import IsOneOf
from fastapi import FastAPI, File
from fastapi.testclient import TestClient
from ..utils import needs_pydanticv2
pytestmark = needs_pydanticv2
app = FastAPI()
# =====================================================================================
# File(alias=...)
# Current situation: Works, but schema is wrong
# Optional[list[bytes]] fails due to another issue (likely not related to aliases)
# Optional[List[bytes]] fails due to another issue (likely not related to aliases)
# ------------------------------
# required field
@ -26,10 +30,7 @@ def test_required_field_alias_by_name():
resp = client.post("/required-field-alias", files={"file": b"content"})
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "file_alias" in detail[0]["loc"]
@ -100,7 +101,7 @@ def test_optional_field_alias_schema():
@app.post("/list-field-alias", operation_id="list_field_alias")
async def list_field_alias(files: list[bytes] = File(alias="files_alias")):
async def list_field_alias(files: List[bytes] = File(alias="files_alias")):
return {"file_sizes": [len(file) for file in files]}
@ -111,10 +112,7 @@ def test_list_field_alias_by_name():
)
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "files_alias" in detail[0]["loc"]
@ -151,7 +149,7 @@ def test_list_field_alias_schema():
@app.post("/optional-list-field-alias", operation_id="optional_list_field_alias")
async def optional_list_field_alias(
files: Optional[list[bytes]] = File(None, alias="files_alias"),
files: Optional[List[bytes]] = File(None, alias="files_alias"),
):
if files is None:
return {"file_sizes": None}
@ -169,7 +167,7 @@ def test_optional_list_field_alias_by_name():
@pytest.mark.xfail(
reason="Optional[list[bytes]] File type causes TypeError in FastAPI",
reason="Optional[List[bytes]] File type causes TypeError in FastAPI",
raises=TypeError,
strict=False,
)
@ -207,7 +205,7 @@ def test_optional_list_field_alias_schema():
# =====================================================================================
# File(validation_alias=...)
# Current situation: schema is correct, but doesn't work (parameter name is used)
# Optional[list[bytes]] fails due to another issue (likely not related to aliases)
# Optional[List[bytes]] fails due to another issue (likely not related to aliases)
# ------------------------------
@ -232,10 +230,7 @@ def test_required_field_validation_alias_by_name():
# AssertionError: assert 200 == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "file_val_alias" in detail[0]["loc"]
@ -320,7 +315,7 @@ def test_optional_field_validation_alias_schema():
@app.post("/list-field-validation-alias", operation_id="list_field_validation_alias")
async def list_field_validation_alias(
files: list[bytes] = File(validation_alias="files_val_alias"),
files: List[bytes] = File(validation_alias="files_val_alias"),
):
return {"file_sizes": [len(file) for file in files]}
@ -337,10 +332,7 @@ def test_list_field_validation_alias_by_name():
# AssertionError: assert 200 == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "files_val_alias" in detail[0]["loc"]
@ -379,7 +371,7 @@ def test_list_field_validation_alias_schema():
operation_id="optional_list_field_validation_alias",
)
async def optional_list_field_validation_alias(
files: Optional[list[bytes]] = File(None, validation_alias="files_val_alias"),
files: Optional[List[bytes]] = File(None, validation_alias="files_val_alias"),
):
if files is None:
return {"file_sizes": None}
@ -387,7 +379,7 @@ async def optional_list_field_validation_alias(
@pytest.mark.xfail(
reason="Optional[list[bytes]] File type causes TypeError in FastAPI",
reason="Optional[List[bytes]] File type causes TypeError in FastAPI",
raises=TypeError,
strict=False,
)
@ -436,7 +428,7 @@ def test_optional_list_field_validation_alias_schema():
# =====================================================================================
# File(alias=..., validation_alias=...)
# Current situation: Schema is correct (validation_alias), but doesn't work (alias is used)
# Optional[list[bytes]] fails due to another issue (likely not related to aliases)
# Optional[List[bytes]] fails due to another issue (likely not related to aliases)
# ------------------------------
# required field
@ -460,10 +452,7 @@ def test_required_field_alias_and_validation_alias_by_name():
)
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "file_val_alias" in detail[0]["loc"]
# Currently fails due to issue with aliases:
# AssertionError: assert 'file_val_alias' in ['body', 'file_alias']
@ -480,10 +469,7 @@ def test_required_field_alias_and_validation_alias_by_alias():
# AssertionError: assert 200 == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "file_val_alias" in detail[0]["loc"]
@ -589,7 +575,7 @@ def test_optional_field_alias_and_validation_alias_schema():
operation_id="list_field_alias_and_validation_alias",
)
async def list_field_alias_and_validation_alias(
files: list[bytes] = File(alias="files_alias", validation_alias="files_val_alias"),
files: List[bytes] = File(alias="files_alias", validation_alias="files_val_alias"),
):
return {"file_sizes": [len(file) for file in files]}
@ -603,10 +589,7 @@ def test_list_field_alias_and_validation_alias_by_name():
)
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "files_val_alias" in detail[0]["loc"]
# Currently fails due to issue with aliases:
# AssertionError: assert 'files_val_alias' in ['body', 'files_alias']
@ -624,10 +607,7 @@ def test_list_field_alias_and_validation_alias_by_alias():
# AssertionError: assert 200 == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "files_val_alias" in detail[0]["loc"]
@ -668,7 +648,7 @@ def test_list_field_alias_and_validation_alias_schema():
operation_id="optional_list_field_alias_and_validation_alias",
)
async def optional_list_field_alias_and_validation_alias(
files: Optional[list[bytes]] = File(
files: Optional[List[bytes]] = File(
None, alias="files_alias", validation_alias="files_val_alias"
),
):
@ -688,7 +668,7 @@ def test_optional_list_field_alias_and_validation_alias_by_name():
@pytest.mark.xfail(
reason="Optional[list[bytes]] File type causes TypeError in FastAPI",
reason="Optional[List[bytes]] File type causes TypeError in FastAPI",
raises=TypeError,
strict=False,
)
@ -754,10 +734,7 @@ def test_workaround_by_name():
resp = client.post("/workaround", files={"file": b"content"})
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "file_alias" in detail[0]["loc"]

65
tests/test_aliases/test_form_field_aliases.py

@ -1,10 +1,14 @@
from typing import Optional
from typing import List, Optional
import pytest
from dirty_equals import IsOneOf
from fastapi import FastAPI, Form
from fastapi.testclient import TestClient
from ..utils import needs_pydanticv2
pytestmark = needs_pydanticv2
app = FastAPI()
# =====================================================================================
@ -25,10 +29,7 @@ def test_required_field_alias_by_name():
resp = client.post("/required-field-alias", data={"param": "123"})
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_alias" in detail[0]["loc"]
@ -97,7 +98,7 @@ def test_optional_field_alias_schema():
@app.post("/list-field-alias", operation_id="list_field_alias")
async def list_field_alias(param: list[str] = Form(alias="param_alias")):
async def list_field_alias(param: List[str] = Form(alias="param_alias")):
return {"param": param}
@ -106,10 +107,7 @@ def test_list_field_alias_by_name():
resp = client.post("/list-field-alias", data={"param": ["123", "456"]})
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_alias" in detail[0]["loc"]
@ -143,7 +141,7 @@ def test_list_field_alias_schema():
@app.post("/optional-list-field-alias", operation_id="optional_list_field_alias")
async def optional_list_field_alias(
param: Optional[list[str]] = Form(None, alias="param_alias"),
param: Optional[List[str]] = Form(None, alias="param_alias"),
):
return {"param": param}
@ -207,10 +205,7 @@ def test_required_field_validation_alias_by_name():
# AssertionError: assert 200 == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
@ -290,7 +285,7 @@ def test_optional_field_validation_alias_schema():
@app.post("/list-field-validation-alias", operation_id="list_field_validation_alias")
async def list_field_validation_alias(
param: list[str] = Form(validation_alias="param_val_alias"),
param: List[str] = Form(validation_alias="param_val_alias"),
):
return {"param": param}
@ -304,10 +299,7 @@ def test_list_field_validation_alias_by_name():
# AssertionError: assert 200 == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
@ -345,7 +337,7 @@ def test_list_field_validation_alias_schema():
operation_id="optional_list_field_validation_alias",
)
async def optional_list_field_validation_alias(
param: Optional[list[str]] = Form(None, validation_alias="param_val_alias"),
param: Optional[List[str]] = Form(None, validation_alias="param_val_alias"),
):
return {"param": param}
@ -414,10 +406,7 @@ def test_required_field_alias_and_validation_alias_by_name():
)
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
# Currently fails due to issue with aliases:
# AssertionError: assert 'param_val_alias' in ['body', 'param_alias']
@ -434,10 +423,7 @@ def test_required_field_alias_and_validation_alias_by_alias():
# AssertionError: assert 200 == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
@ -535,7 +521,7 @@ def test_optional_field_alias_and_validation_alias_schema():
operation_id="list_field_alias_and_validation_alias",
)
async def list_field_alias_and_validation_alias(
param: list[str] = Form(alias="param_alias", validation_alias="param_val_alias"),
param: List[str] = Form(alias="param_alias", validation_alias="param_val_alias"),
):
return {"param": param}
@ -548,10 +534,7 @@ def test_list_field_alias_and_validation_alias_by_name():
)
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
# Currently fails due to issue with aliases:
# AssertionError: assert 'param_val_alias' in ['body', 'param_alias']
@ -568,10 +551,7 @@ def test_list_field_alias_and_validation_alias_by_alias():
# AssertionError: assert 200 == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
@ -612,7 +592,7 @@ def test_list_field_alias_and_validation_alias_schema():
operation_id="optional_list_field_alias_and_validation_alias",
)
async def optional_list_field_alias_and_validation_alias(
param: Optional[list[str]] = Form(
param: Optional[List[str]] = Form(
None, alias="param_alias", validation_alias="param_val_alias"
),
):
@ -686,10 +666,7 @@ def test_workaround_by_name():
resp = client.post("/workaround", data={"param": "123"})
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_alias" in detail[0]["loc"]

91
tests/test_aliases/test_form_model_aliases.py

@ -1,11 +1,14 @@
from typing import Annotated, Optional
from typing import List, Optional
import pytest
from dirty_equals import IsOneOf
from fastapi import FastAPI, Form
from fastapi.testclient import TestClient
from pydantic import BaseModel, Field
from ..utils import needs_pydanticv2
pytestmark = needs_pydanticv2
app = FastAPI()
# =====================================================================================
@ -21,7 +24,7 @@ class RequiredFieldAliasModel(BaseModel):
@app.post("/required-field-alias-model")
async def required_field_alias_model(data: Annotated[RequiredFieldAliasModel, Form()]):
async def required_field_alias_model(data: RequiredFieldAliasModel = Form(...)):
return {"param": data.param}
@ -30,10 +33,7 @@ def test_required_field_alias_model_by_name():
resp = client.post("/required-field-alias-model", data={"param": "123"})
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_alias" in detail[0]["loc"]
@ -61,7 +61,7 @@ class OptionalFieldAliasModel(BaseModel):
@app.post("/optional-field-alias-model")
async def optional_field_alias_model(data: Annotated[OptionalFieldAliasModel, Form()]):
async def optional_field_alias_model(data: OptionalFieldAliasModel = Form(...)):
return {"param": data.param}
@ -95,11 +95,11 @@ def test_optional_field_alias_model_schema():
class ListFieldAliasModel(BaseModel):
param: list[str] = Field(alias="param_alias")
param: List[str] = Field(alias="param_alias")
@app.post("/list-field-alias-model")
async def list_field_alias_model(data: Annotated[ListFieldAliasModel, Form()]):
async def list_field_alias_model(data: ListFieldAliasModel = Form(...)):
return {"param": data.param}
@ -108,10 +108,7 @@ def test_list_field_alias_model_by_name():
resp = client.post("/list-field-alias-model", data={"param": ["123", "456"]})
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_alias" in detail[0]["loc"]
@ -139,12 +136,12 @@ def test_list_field_alias_model_schema():
class OptionalListFieldAliasModel(BaseModel):
param: Optional[list[str]] = Field(None, alias="param_alias")
param: Optional[List[str]] = Field(None, alias="param_alias")
@app.post("/optional-list-field-alias-model")
async def optional_list_field_alias_model(
data: Annotated[OptionalListFieldAliasModel, Form()],
data: OptionalListFieldAliasModel = Form(...),
):
return {"param": data.param}
@ -170,8 +167,12 @@ def test_optional_list_field_alias_model_by_alias():
def test_optional_list_field_alias_model_schema():
openapi = app.openapi()
body_schema = openapi["components"]["schemas"]["OptionalListFieldAliasModel"]
assert len(body_schema["properties"]) == 1
assert "param_alias" in body_schema["properties"]
assert body_schema["properties"] == {
"param_alias": {
"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}],
"title": "Param Alias",
}
}
# =====================================================================================
@ -192,7 +193,7 @@ class RequiredFieldValidationAliasModel(BaseModel):
operation_id="required_field_validation_alias_model",
)
async def required_field_validation_alias_model(
data: Annotated[RequiredFieldValidationAliasModel, Form()],
data: RequiredFieldValidationAliasModel = Form(...),
):
return {"param": data.param}
@ -202,10 +203,7 @@ def test_required_field_validation_alias_model_by_name():
resp = client.post("/required-field-validation-alias-model", data={"param": "123"})
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
@ -239,7 +237,7 @@ class OptionalFieldValidationAliasModel(BaseModel):
operation_id="optional_field_validation_alias_model",
)
async def optional_field_validation_alias_model(
data: Annotated[OptionalFieldValidationAliasModel, Form()],
data: OptionalFieldValidationAliasModel = Form(...),
):
return {"param": data.param}
@ -276,7 +274,7 @@ def test_optional_field_validation_alias_model_schema():
class ListFieldValidationAliasModel(BaseModel):
param: list[str] = Field(validation_alias="param_val_alias")
param: List[str] = Field(validation_alias="param_val_alias")
@app.post(
@ -284,7 +282,7 @@ class ListFieldValidationAliasModel(BaseModel):
operation_id="list_field_validation_alias_model",
)
async def list_field_validation_alias_model(
data: Annotated[ListFieldValidationAliasModel, Form()],
data: ListFieldValidationAliasModel = Form(...),
):
return {"param": data.param}
@ -296,10 +294,7 @@ def test_list_field_validation_alias_model_by_name():
)
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
@ -334,7 +329,7 @@ def test_list_field_validation_alias_model_schema():
class OptionalListFieldValidationAliasModel(BaseModel):
param: Optional[list[str]] = Field(None, validation_alias="param_val_alias")
param: Optional[List[str]] = Field(None, validation_alias="param_val_alias")
@app.post(
@ -342,7 +337,7 @@ class OptionalListFieldValidationAliasModel(BaseModel):
operation_id="optional_list_field_validation_alias_model",
)
async def optional_list_field_validation_alias_model(
data: Annotated[OptionalListFieldValidationAliasModel, Form()],
data: OptionalListFieldValidationAliasModel = Form(...),
):
return {"param": data.param}
@ -401,7 +396,7 @@ class RequiredFieldAliasAndValidationAliasModel(BaseModel):
operation_id="required_field_alias_and_validation_alias_model",
)
async def required_field_alias_and_validation_alias_model(
data: Annotated[RequiredFieldAliasAndValidationAliasModel, Form()],
data: RequiredFieldAliasAndValidationAliasModel = Form(...),
):
return {"param": data.param}
@ -413,10 +408,7 @@ def test_required_field_alias_and_validation_alias_model_by_name():
)
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
@ -427,10 +419,7 @@ def test_required_field_alias_and_validation_alias_model_by_alias():
)
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
@ -469,7 +458,7 @@ class OptionalFieldAliasAndValidationAliasModel(BaseModel):
operation_id="optional_field_alias_and_validation_alias_model",
)
async def optional_field_alias_and_validation_alias_model(
data: Annotated[OptionalFieldAliasAndValidationAliasModel, Form()],
data: OptionalFieldAliasAndValidationAliasModel = Form(...),
):
return {"param": data.param}
@ -520,7 +509,7 @@ def test_optional_field_alias_and_validation_alias_model_schema():
class ListFieldAliasAndValidationAliasModel(BaseModel):
param: list[str] = Field(alias="param_alias", validation_alias="param_val_alias")
param: List[str] = Field(alias="param_alias", validation_alias="param_val_alias")
@app.post(
@ -528,7 +517,7 @@ class ListFieldAliasAndValidationAliasModel(BaseModel):
operation_id="list_field_alias_and_validation_alias_model",
)
async def list_field_alias_and_validation_alias_model(
data: Annotated[ListFieldAliasAndValidationAliasModel, Form()],
data: ListFieldAliasAndValidationAliasModel = Form(...),
):
return {"param": data.param}
@ -540,10 +529,7 @@ def test_list_field_alias_and_validation_alias_model_by_name():
)
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
@ -555,10 +541,7 @@ def test_list_field_alias_and_validation_alias_model_by_alias():
)
assert resp.status_code == 422
detail = resp.json()["detail"]
assert detail[0]["msg"] == IsOneOf(
"Field required",
"field required", # TODO: remove when deprecating Pydantic v1
)
assert detail[0]["msg"] == "Field required"
assert "param_val_alias" in detail[0]["loc"]
@ -596,7 +579,7 @@ def test_list_field_alias_and_validation_alias_model_schema():
class OptionalListFieldAliasAndValidationAliasModel(BaseModel):
param: Optional[list[str]] = Field(
param: Optional[List[str]] = Field(
None, alias="param_alias", validation_alias="param_val_alias"
)
@ -606,7 +589,7 @@ class OptionalListFieldAliasAndValidationAliasModel(BaseModel):
operation_id="optional_list_field_alias_and_validation_alias_model",
)
async def optional_list_field_alias_and_validation_alias_model(
data: Annotated[OptionalListFieldAliasAndValidationAliasModel, Form()],
data: OptionalListFieldAliasAndValidationAliasModel = Form(...),
):
return {"param": data.param}

Loading…
Cancel
Save