From 684c0077cc0ef48364cd3241b80a135213376d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 21 Jul 2021 19:54:08 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20support=20for=20`dataclasses`?= =?UTF-8?q?=20in=20request=20bodies=20and=20`response=5Fmodel`=20(#3577)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/advanced/dataclasses.md | 98 ++++++++++ .../docs/img/tutorial/dataclasses/image01.png | Bin 0 -> 72574 bytes docs/en/mkdocs.yml | 1 + docs_src/dataclasses/tutorial001.py | 20 ++ docs_src/dataclasses/tutorial002.py | 26 +++ docs_src/dataclasses/tutorial003.py | 55 ++++++ fastapi/dependencies/utils.py | 2 + .../test_dataclasses/test_tutorial001.py | 113 +++++++++++ .../test_dataclasses/test_tutorial002.py | 66 +++++++ .../test_dataclasses/test_tutorial003.py | 181 ++++++++++++++++++ 10 files changed, 562 insertions(+) create mode 100644 docs/en/docs/advanced/dataclasses.md create mode 100644 docs/en/docs/img/tutorial/dataclasses/image01.png create mode 100644 docs_src/dataclasses/tutorial001.py create mode 100644 docs_src/dataclasses/tutorial002.py create mode 100644 docs_src/dataclasses/tutorial003.py create mode 100644 tests/test_tutorial/test_dataclasses/test_tutorial001.py create mode 100644 tests/test_tutorial/test_dataclasses/test_tutorial002.py create mode 100644 tests/test_tutorial/test_dataclasses/test_tutorial003.py diff --git a/docs/en/docs/advanced/dataclasses.md b/docs/en/docs/advanced/dataclasses.md new file mode 100644 index 000000000..80a063bb8 --- /dev/null +++ b/docs/en/docs/advanced/dataclasses.md @@ -0,0 +1,98 @@ +# Using Dataclasses + +FastAPI is built on top of **Pydantic**, and I have been showing you how to use Pydantic models to declare requests and responses. + +But FastAPI also supports using `dataclasses` the same way: + +```Python hl_lines="1 7-12 19-20" +{!../../../docs_src/dataclasses/tutorial001.py!} +``` + +This is still thanks to **Pydantic**, as it has internal support for `dataclasses`. + +So, even with the code above that doesn't use Pydantic explicitly, FastAPI is using Pydantic to convert those standard dataclasses to Pydantic's own flavor of dataclasses. + +And of course, it supports the same: + +* data validation +* data serialization +* data documentation, etc. + +This works the same way as with Pydantic models. And it is actually achieved in the same way underneath, using Pydantic. + +!!! info + Have in mind that dataclasses can't do everything Pydantic models can do. + + So, you might still need to use Pydantic models. + + But if you have a bunch of dataclasses laying around, this is a nice trick to use them to power a web API using FastAPI. 🤓 + +## Dataclasses in `response_model` + +You can also use `dataclasses` in the `response_model` parameter: + +```Python hl_lines="1 7-13 19" +{!../../../docs_src/dataclasses/tutorial002.py!} +``` + +The dataclass will be automatically converted to a Pydantic dataclass. + +This way, its schema will show up in the API docs user interface: + + + +## Dataclasses in Nested Data Structures + +You can also combine `dataclasses` with other type annotations to make nested data structures. + +In some cases, you might still have to use Pydantic's version of `dataclasses`. For example, if you have errors with the automatically generated API documentation. + +In that case, you can simply swap the standard `dataclasses` with `pydantic.dataclasses`, which is a drop-in replacement: + +```{ .python .annotate hl_lines="1 5 8-11 14-17 23-25 28" } +{!../../../docs_src/dataclasses/tutorial003.py!} +``` + +1. We still import `field` from standard `dataclasses`. + +2. `pydantic.dataclasses` is a drop-in replacement for `dataclasses`. + +3. The `Author` dataclass includes a list of `Item` dataclasses. + +4. The `Author` dataclass is used as the `response_model` parameter. + +5. You can use other standard type annotations with dataclasses as the request body. + + In this case, it's a list of `Item` dataclasses. + +6. Here we are returning a dictionary that contains `items` which is a list of dataclasses. + + FastAPI is still capable of serializing the data to JSON. + +7. Here the `response_model` is using a type annotation of a list of `Author` dataclasses. + + Again, you can combine `dataclasses` with standard type annotations. + +8. Notice that this *path operation function* uses regular `def` instead of `async def`. + + As always, in FastAPI you can combine `def` and `async def` as needed. + + If you need a refresher about when to use which, check out the section _"In a hurry?"_ in the docs about `async` and `await`. + +9. This *path operation function* is not returning dataclasses (although it could), but a list of dictionaries with internal data. + + FastAPI will use the `response_model` parameter (that includes dataclasses) to convert the response. + +You can combine `dataclasses` with other type annotations in many different combinations to form complex data structures. + +Check the in-code annotation tips above to see more specific details. + +## Learn More + +You can also combine `dataclasses` with other Pydantic models, inherit from them, include them in your own models, etc. + +To learn more, check the Pydantic docs about dataclasses. + +## Version + +This is available since FastAPI version `0.67.0`. 🔖 diff --git a/docs/en/docs/img/tutorial/dataclasses/image01.png b/docs/en/docs/img/tutorial/dataclasses/image01.png new file mode 100644 index 0000000000000000000000000000000000000000..7815f40adf065b51cd1a1e9fb2cd0221db2bcba7 GIT binary patch literal 72574 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 bool: field.shape == SHAPE_SINGLETON and not lenient_issubclass(field.type_, BaseModel) and not lenient_issubclass(field.type_, sequence_types + (dict,)) + and not dataclasses.is_dataclass(field.type_) and not isinstance(field_info, params.Body) ): return False diff --git a/tests/test_tutorial/test_dataclasses/test_tutorial001.py b/tests/test_tutorial/test_dataclasses/test_tutorial001.py new file mode 100644 index 000000000..3e3fc9acf --- /dev/null +++ b/tests/test_tutorial/test_dataclasses/test_tutorial001.py @@ -0,0 +1,113 @@ +from fastapi.testclient import TestClient + +from docs_src.dataclasses.tutorial001 import app + +client = TestClient(app) + +openapi_schema = { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/items/": { + "post": { + "summary": "Create Item", + "operationId": "create_item_items__post", + "requestBody": { + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/Item"} + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + } + }, + "components": { + "schemas": { + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + "Item": { + "title": "Item", + "required": ["name", "price"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "price": {"title": "Price", "type": "number"}, + "description": {"title": "Description", "type": "string"}, + "tax": {"title": "Tax", "type": "number"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + } + }, +} + + +def test_openapi_schema(): + response = client.get("/openapi.json") + assert response.status_code == 200 + assert response.json() == openapi_schema + + +def test_post_item(): + response = client.post("/items/", json={"name": "Foo", "price": 3}) + assert response.status_code == 200 + assert response.json() == { + "name": "Foo", + "price": 3, + "description": None, + "tax": None, + } + + +def test_post_invalid_item(): + response = client.post("/items/", json={"name": "Foo", "price": "invalid price"}) + assert response.status_code == 422 + assert response.json() == { + "detail": [ + { + "loc": ["body", "price"], + "msg": "value is not a valid float", + "type": "type_error.float", + } + ] + } diff --git a/tests/test_tutorial/test_dataclasses/test_tutorial002.py b/tests/test_tutorial/test_dataclasses/test_tutorial002.py new file mode 100644 index 000000000..10d8d227d --- /dev/null +++ b/tests/test_tutorial/test_dataclasses/test_tutorial002.py @@ -0,0 +1,66 @@ +from fastapi.testclient import TestClient + +from docs_src.dataclasses.tutorial002 import app + +client = TestClient(app) + +openapi_schema = { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/items/next": { + "get": { + "summary": "Read Next Item", + "operationId": "read_next_item_items_next_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/Item"} + } + }, + } + }, + } + } + }, + "components": { + "schemas": { + "Item": { + "title": "Item", + "required": ["name", "price", "tags"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "price": {"title": "Price", "type": "number"}, + "tags": { + "title": "Tags", + "type": "array", + "items": {"type": "string"}, + }, + "description": {"title": "Description", "type": "string"}, + "tax": {"title": "Tax", "type": "number"}, + }, + } + } + }, +} + + +def test_openapi_schema(): + response = client.get("/openapi.json") + assert response.status_code == 200 + assert response.json() == openapi_schema + + +def test_get_item(): + response = client.get("/items/next") + assert response.status_code == 200 + assert response.json() == { + "name": "Island In The Moon", + "price": 12.99, + "description": "A place to be be playin' and havin' fun", + "tags": ["breater"], + "tax": None, + } diff --git a/tests/test_tutorial/test_dataclasses/test_tutorial003.py b/tests/test_tutorial/test_dataclasses/test_tutorial003.py new file mode 100644 index 000000000..dd0f1f2c0 --- /dev/null +++ b/tests/test_tutorial/test_dataclasses/test_tutorial003.py @@ -0,0 +1,181 @@ +from fastapi.testclient import TestClient + +from docs_src.dataclasses.tutorial003 import app + +client = TestClient(app) + +openapi_schema = { + "openapi": "3.0.2", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "paths": { + "/authors/{author_id}/items/": { + "post": { + "summary": "Create Author Items", + "operationId": "create_author_items_authors__author_id__items__post", + "parameters": [ + { + "required": True, + "schema": {"title": "Author Id", "type": "string"}, + "name": "author_id", + "in": "path", + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "title": "Items", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + } + } + }, + "required": True, + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/Author"} + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/authors/": { + "get": { + "summary": "Get Authors", + "operationId": "get_authors_authors__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Get Authors Authors Get", + "type": "array", + "items": {"$ref": "#/components/schemas/Author"}, + } + } + }, + } + }, + } + }, + }, + "components": { + "schemas": { + "Author": { + "title": "Author", + "required": ["name"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "items": { + "title": "Items", + "type": "array", + "items": {"$ref": "#/components/schemas/Item"}, + }, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + "Item": { + "title": "Item", + "required": ["name"], + "type": "object", + "properties": { + "name": {"title": "Name", "type": "string"}, + "description": {"title": "Description", "type": "string"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + } + }, +} + + +def test_openapi_schema(): + response = client.get("/openapi.json") + assert response.status_code == 200 + assert response.json() == openapi_schema + + +def test_post_authors_item(): + response = client.post( + "/authors/foo/items/", + json=[{"name": "Bar"}, {"name": "Baz", "description": "Drop the Baz"}], + ) + assert response.status_code == 200 + assert response.json() == { + "name": "foo", + "items": [ + {"name": "Bar", "description": None}, + {"name": "Baz", "description": "Drop the Baz"}, + ], + } + + +def test_get_authors(): + response = client.get("/authors/") + assert response.status_code == 200 + assert response.json() == [ + { + "name": "Breaters", + "items": [ + { + "name": "Island In The Moon", + "description": "A place to be be playin' and havin' fun", + }, + {"name": "Holy Buddies", "description": None}, + ], + }, + { + "name": "System of an Up", + "items": [ + { + "name": "Salt", + "description": "The kombucha mushroom people's favorite", + }, + {"name": "Pad Thai", "description": None}, + { + "name": "Lonely Night", + "description": "The mostests lonliest nightiest of allest", + }, + ], + }, + ]