Add 'mode' field to PydanticDumpOptions TypedDict#113
Open
KalleDK wants to merge 1 commit intopgjones:mainfrom
Open
Add 'mode' field to PydanticDumpOptions TypedDict#113KalleDK wants to merge 1 commit intopgjones:mainfrom
KalleDK wants to merge 1 commit intopgjones:mainfrom
Conversation
This is used when objects like IPv4Address or other custom objects is not reconised by the json serializer.
Owner
|
I'm not sure this is required, the addition of a JSONEncoder here should ensure that it is converted to JSON |
Contributor
Author
|
I can only have this working when I set mode Without mode from http import HTTPStatus
from ipaddress import IPv4Address
import pydantic
import quart_schema
from quart import Quart
class DemoResp(pydantic.BaseModel):
message: str
ip: IPv4Address
schema = quart_schema.QuartSchema()
app = Quart(__name__)
schema.init_app(app)
@app.get("/hello")
@quart_schema.validate_response(DemoResp, HTTPStatus.OK)
def hello() -> tuple[DemoResp, int]:
return DemoResp(message="Hello, World!", ip=IPv4Address("127.0.0.1")), HTTPStatus.OK
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000)With mode from http import HTTPStatus
from ipaddress import IPv4Address
import pydantic
import quart_schema
from quart import Quart
class DemoResp(pydantic.BaseModel):
message: str
ip: IPv4Address
schema = quart_schema.QuartSchema()
app = Quart(__name__)
app.config["QUART_SCHEMA_PYDANTIC_DUMP_OPTIONS"] = {"mode": "json"}
schema.init_app(app)
@app.get("/hello")
@quart_schema.validate_response(DemoResp, HTTPStatus.OK)
def hello() -> tuple[DemoResp, int]:
return DemoResp(message="Hello, World!", ip=IPv4Address("127.0.0.1")), HTTPStatus.OK
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000) |
Contributor
Author
|
@pgjones from http import HTTPStatus
import pydantic
import quart_schema
from quart import Quart
class StupidApiModel(pydantic.BaseModel):
name: str
version: str
@pydantic.field_validator("version", "name", mode="before")
@classmethod
def _validate_value_dict(cls, v: dict[str, str] | str) -> str:
if isinstance(v, str):
return v
return v["value"]
@pydantic.field_serializer("version", "name", when_used="json")
def _serialize_value_dict(self, v: str) -> dict[str, str]:
return {"value": v}
schema = quart_schema.QuartSchema()
app = Quart(__name__)
schema.init_app(app)
@app.get("/world")
@quart_schema.validate_response(StupidApiModel, HTTPStatus.OK)
def world() -> tuple[StupidApiModel, int]:
return StupidApiModel(name="World", version="1.0"), HTTPStatus.OK
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000)This incorrectly returns With the json mode from http import HTTPStatus
import pydantic
import quart_schema
from quart import Quart
class StupidApiModel(pydantic.BaseModel):
name: str
version: str
@pydantic.field_validator("version", "name", mode="before")
@classmethod
def _validate_value_dict(cls, v: dict[str, str] | str) -> str:
if isinstance(v, str):
return v
return v["value"]
@pydantic.field_serializer("version", "name", when_used="json")
def _serialize_value_dict(self, v: str) -> dict[str, str]:
return {"value": v}
schema = quart_schema.QuartSchema()
app = Quart(__name__)
app.config["QUART_SCHEMA_PYDANTIC_DUMP_OPTIONS"] = {"mode": "json"}
schema.init_app(app)
@app.get("/world")
@quart_schema.validate_response(StupidApiModel, HTTPStatus.OK)
def world() -> tuple[StupidApiModel, int]:
return StupidApiModel(name="World", version="1.0"), HTTPStatus.OK
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000)Correctly returns |
Owner
|
I'm not sure what is going wrong here, when I try from http import HTTPStatus
from ipaddress import IPv4Address
import pydantic
import quart_schema
from quart import Quart
class DemoResp(pydantic.BaseModel):
message: str
ip: IPv4Address
schema = quart_schema.QuartSchema()
app = Quart(__name__)
schema.init_app(app)
@app.get("/hello")
@quart_schema.validate_response(DemoResp, HTTPStatus.OK)
def hello() -> tuple[DemoResp, int]:
return DemoResp(message="Hello, World!", ip=IPv4Address("127.0.0.1")), HTTPStatus.OK
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000)it works. Do you have the full stack trace for the |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This is used when objects like IPv4Address or other custom objects is not reconised by the json serializer.
Often you want your model_dump to give you the object not serialized like IPv4Addresses, but you want
model_dump(mode="json")to give you the string.I would even suggest that
mode="json"should be default, but I'm afraid that would break som peoples code.