From 684c0077cc0ef48364cd3241b80a135213376d22 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 21 Jul 2021 19:54:08 +0200 Subject: [PATCH] =?utf8?q?=E2=9C=A8=20Add=20support=20for=20`dataclasses`?= =?utf8?q?=20in=20request=20bodies=20and=20`response=5Fmodel`=20(#3577)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 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 0000000000..80a063bb87 --- /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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 RfO`6gi^zN_71Hzj-vHM#j5GiM literal 0 Hc-jL100001 diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index d86ea1c391..a927bdb3b4 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -119,6 +119,7 @@ nav: - advanced/security/oauth2-scopes.md - advanced/security/http-basic-auth.md - advanced/using-request-directly.md + - advanced/dataclasses.md - advanced/middleware.md - advanced/sql-databases-peewee.md - advanced/async-sql-databases.md diff --git a/docs_src/dataclasses/tutorial001.py b/docs_src/dataclasses/tutorial001.py new file mode 100644 index 0000000000..43015eb27f --- /dev/null +++ b/docs_src/dataclasses/tutorial001.py @@ -0,0 +1,20 @@ +from dataclasses import dataclass +from typing import Optional + +from fastapi import FastAPI + + +@dataclass +class Item: + name: str + price: float + description: Optional[str] = None + tax: Optional[float] = None + + +app = FastAPI() + + +@app.post("/items/") +async def create_item(item: Item): + return item diff --git a/docs_src/dataclasses/tutorial002.py b/docs_src/dataclasses/tutorial002.py new file mode 100644 index 0000000000..aaa7b8799c --- /dev/null +++ b/docs_src/dataclasses/tutorial002.py @@ -0,0 +1,26 @@ +from dataclasses import dataclass, field +from typing import List, Optional + +from fastapi import FastAPI + + +@dataclass +class Item: + name: str + price: float + tags: List[str] = field(default_factory=list) + description: Optional[str] = None + tax: Optional[float] = None + + +app = FastAPI() + + +@app.get("/items/next", response_model=Item) +async def read_next_item(): + return { + "name": "Island In The Moon", + "price": 12.99, + "description": "A place to be be playin' and havin' fun", + "tags": ["breater"], + } diff --git a/docs_src/dataclasses/tutorial003.py b/docs_src/dataclasses/tutorial003.py new file mode 100644 index 0000000000..2c1fccdd71 --- /dev/null +++ b/docs_src/dataclasses/tutorial003.py @@ -0,0 +1,55 @@ +from dataclasses import field # (1) +from typing import List, Optional + +from fastapi import FastAPI +from pydantic.dataclasses import dataclass # (2) + + +@dataclass +class Item: + name: str + description: Optional[str] = None + + +@dataclass +class Author: + name: str + items: List[Item] = field(default_factory=list) # (3) + + +app = FastAPI() + + +@app.post("/authors/{author_id}/items/", response_model=Author) # (4) +async def create_author_items(author_id: str, items: List[Item]): # (5) + return {"name": author_id, "items": items} # (6) + + +@app.get("/authors/", response_model=List[Author]) # (7) +def get_authors(): # (8) + return [ # (9) + { + "name": "Breaters", + "items": [ + { + "name": "Island In The Moon", + "description": "A place to be be playin' and havin' fun", + }, + {"name": "Holy Buddies"}, + ], + }, + { + "name": "System of an Up", + "items": [ + { + "name": "Salt", + "description": "The kombucha mushroom people's favorite", + }, + {"name": "Pad Thai"}, + { + "name": "Lonely Night", + "description": "The mostests lonliest nightiest of allest", + }, + ], + }, + ] diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 923669b94b..95049d40ea 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -1,4 +1,5 @@ import asyncio +import dataclasses import inspect from contextlib import contextmanager from copy import deepcopy @@ -217,6 +218,7 @@ def is_scalar_field(field: ModelField) -> 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 0000000000..3e3fc9acf6 --- /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 0000000000..10d8d227dc --- /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 0000000000..dd0f1f2c0d --- /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", + }, + ], + }, + ] -- 2.47.3