From f6667ecfb0999d82c8a21c8625a339702e0113cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 15 Dec 2018 15:20:22 +0400 Subject: [PATCH] :memo: Add docs for custom response --- docs/img/tutorial/custom-response/image01.png | Bin 0 -> 54866 bytes docs/tutorial/custom-response.md | 115 ++++++++++++++++++ .../src/custom-response/tutorial001.py | 9 ++ .../src/custom-response/tutorial002.py | 18 +++ .../src/custom-response/tutorial003.py | 19 +++ .../src/custom-response/tutorial004.py | 23 ++++ mkdocs.yml | 1 + 7 files changed, 185 insertions(+) create mode 100644 docs/img/tutorial/custom-response/image01.png create mode 100644 docs/tutorial/custom-response.md create mode 100644 docs/tutorial/src/custom-response/tutorial001.py create mode 100644 docs/tutorial/src/custom-response/tutorial002.py create mode 100644 docs/tutorial/src/custom-response/tutorial003.py create mode 100644 docs/tutorial/src/custom-response/tutorial004.py diff --git a/docs/img/tutorial/custom-response/image01.png b/docs/img/tutorial/custom-response/image01.png new file mode 100644 index 0000000000000000000000000000000000000000..281746b26599a709e3980fb2aefad76b62c68a70 GIT binary patch literal 54866 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 I2pb0e54J;0#sB~S literal 0 HcmV?d00001 diff --git a/docs/tutorial/custom-response.md b/docs/tutorial/custom-response.md new file mode 100644 index 000000000..a0da6ccc1 --- /dev/null +++ b/docs/tutorial/custom-response.md @@ -0,0 +1,115 @@ +!!! warning + This is a rather advanced topic. + + If you are starting with **FastAPI**, you might not need this. + +By default, **FastAPI** will return the responses using Starlette's `JSONResponse`. + +But you can override it. + +## Use `UJSONResponse` + +For example, if you are squeezing performance, you can use `ujson` and set the response to be Starlette's `UJSONResponse`. + +### Import `UJSONResponse` + +```Python hl_lines="2" +{!./tutorial/src/custom-response/tutorial001.py!} +``` + +!!! note + Notice that you import it directly from `starlette.responses`, not from `fastapi`. + +### Make your path operation use it + +Make your path operation use `UJSONResponse` as the response class using the parameter `content_type`: + +```Python hl_lines="7" +{!./tutorial/src/custom-response/tutorial001.py!} +``` + +!!! info + The parameter is called `content_type` because it will also be used to define the "media type" of the response. + + And will be documented as such in OpenAPI. + +## HTML Response + +To return a response with HTML directly from **FastAPI**, use `HTMLResponse`. + +### Import `HTMLResponse` + +```Python hl_lines="2" +{!./tutorial/src/custom-response/tutorial002.py!} +``` + +!!! note + Notice that you import it directly from `starlette.responses`, not from `fastapi`. + + +### Define your `content_type` class + +Pass `HTMLResponse` as the parameter `content_type` of your path operation: + +```Python hl_lines="7" +{!./tutorial/src/custom-response/tutorial002.py!} +``` + +!!! info + The parameter is called `content_type` because it will also be used to define the "media type" of the response. + + In this case, the HTTP header `Content-Type` will be set to `text/html`. + + And it will be documented as such in OpenAPI. + + +### return a Starlette `Response` + +You can also override the response directly in your path operation. + +If you return an object that is an instance of Starlette's `Response`, it will be used as the response directly. + +The same example from above, returning an `HTMLResponse`, could look like: + +```Python hl_lines="7" +{!./tutorial/src/custom-response/tutorial003.py!} +``` + +!!! info + Of course, the `Content-Type` header will come from the the `Response` object your returned. + +!!! warning + A `Response` returned directly by your path operation function won't be documented in OpenAPI and won't be visible in the automatic interactive docs. + + +### Document in OpenAPI and override `Response` + +If you want to override the response from inside of the function but at the same time document the "media type" in OpenAPI, you can use the `content_type` parameter AND return a `Response` object. + +The `content_type` class will then be used only to document the OpenAPI path operation, but your `Response` will be used as is. + +#### Return an `HTMLResponse` directly + +For example, it could be something like: + +```Python hl_lines="7 23" +{!./tutorial/src/custom-response/tutorial004.py!} +``` + +In this example, the function `generate_html_response()` already generates a Starlette `Response` instead of the HTML in a `str`. + +By returning the result of calling `generate_html_response()`, you are already returning a `Response` that will override the default **FastAPI** behavior. + +#### Declare `HTMLResponse` as `content_type` + +But by declaring it also in the path operation decorator: + +```Python hl_lines="21" +{!./tutorial/src/custom-response/tutorial004.py!} +``` + +#### OpenAPI knows how to document it + +...**FastAPI** will be able to document it in OpenAPI and in the interactive docs as HTML with `text/html`: + + diff --git a/docs/tutorial/src/custom-response/tutorial001.py b/docs/tutorial/src/custom-response/tutorial001.py new file mode 100644 index 000000000..bba3f342d --- /dev/null +++ b/docs/tutorial/src/custom-response/tutorial001.py @@ -0,0 +1,9 @@ +from fastapi import FastAPI +from starlette.responses import UJSONResponse + +app = FastAPI() + + +@app.get("/items/", content_type=UJSONResponse) +async def read_items(): + return [{"item_id": "Foo"}] diff --git a/docs/tutorial/src/custom-response/tutorial002.py b/docs/tutorial/src/custom-response/tutorial002.py new file mode 100644 index 000000000..214e64263 --- /dev/null +++ b/docs/tutorial/src/custom-response/tutorial002.py @@ -0,0 +1,18 @@ +from fastapi import FastAPI +from starlette.responses import HTMLResponse + +app = FastAPI() + + +@app.get("/items/", content_type=HTMLResponse) +async def read_items(): + return """ + + + Some HTML in here + + +

Look ma! HTML!

+ + + """ diff --git a/docs/tutorial/src/custom-response/tutorial003.py b/docs/tutorial/src/custom-response/tutorial003.py new file mode 100644 index 000000000..ba0819cec --- /dev/null +++ b/docs/tutorial/src/custom-response/tutorial003.py @@ -0,0 +1,19 @@ +from fastapi import FastAPI +from starlette.responses import HTMLResponse + +app = FastAPI() + + +@app.get("/items/") +async def read_items(): + html_content = """ + + + Some HTML in here + + +

Look ma! HTML!

+ + + """ + return HTMLResponse(content=html_content, status_code=200) diff --git a/docs/tutorial/src/custom-response/tutorial004.py b/docs/tutorial/src/custom-response/tutorial004.py new file mode 100644 index 000000000..b19783c05 --- /dev/null +++ b/docs/tutorial/src/custom-response/tutorial004.py @@ -0,0 +1,23 @@ +from fastapi import FastAPI +from starlette.responses import HTMLResponse + +app = FastAPI() + + +def generate_html_response(): + html_content = """ + + + Some HTML in here + + +

Look ma! HTML!

+ + + """ + return HTMLResponse(content=html_content, status_code=200) + + +@app.get("/items/", content_type=HTMLResponse) +async def read_items(): + return generate_html_response() diff --git a/mkdocs.yml b/mkdocs.yml index 1f2b89311..7ece1dd25 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -36,6 +36,7 @@ nav: - Request Forms and Files: 'tutorial/request-forms-and-files.md' - Path Operation Configuration: 'tutorial/path-operation-configuration.md' - Path Operation Advanced Configuration: 'tutorial/path-operation-advanced-configuration.md' + - Custom Response: 'tutorial/custom-response.md' - Concurrency and async / await: 'async.md' - Deployment: 'deployment.md'