| import importlib |
| from typing import Any, Protocol, cast |
|
|
| from fastapi.exceptions import FastAPIDeprecationWarning |
| from fastapi.sse import EventSourceResponse as EventSourceResponse |
| from starlette.responses import FileResponse as FileResponse |
| from starlette.responses import HTMLResponse as HTMLResponse |
| from starlette.responses import JSONResponse as JSONResponse |
| from starlette.responses import PlainTextResponse as PlainTextResponse |
| from starlette.responses import RedirectResponse as RedirectResponse |
| from starlette.responses import Response as Response |
| from starlette.responses import StreamingResponse as StreamingResponse |
| from typing_extensions import deprecated |
|
|
|
|
| class _UjsonModule(Protocol): |
| def dumps(self, __obj: Any, *, ensure_ascii: bool = ...) -> str: ... |
|
|
|
|
| class _OrjsonModule(Protocol): |
| OPT_NON_STR_KEYS: int |
| OPT_SERIALIZE_NUMPY: int |
|
|
| def dumps(self, __obj: Any, *, option: int = ...) -> bytes: ... |
|
|
|
|
| try: |
| ujson = cast(_UjsonModule, importlib.import_module("ujson")) |
| except ModuleNotFoundError: |
| ujson = None |
|
|
|
|
| try: |
| orjson = cast(_OrjsonModule, importlib.import_module("orjson")) |
| except ModuleNotFoundError: |
| orjson = None |
|
|
|
|
| @deprecated( |
| "UJSONResponse is deprecated, FastAPI now serializes data directly to JSON " |
| "bytes via Pydantic when a return type or response model is set, which is " |
| "faster and doesn't need a custom response class. Read more in the FastAPI " |
| "docs: https://fastapi.tiangolo.com/advanced/custom-response/#orjson-or-response-model " |
| "and https://fastapi.tiangolo.com/tutorial/response-model/", |
| category=FastAPIDeprecationWarning, |
| stacklevel=2, |
| ) |
| class UJSONResponse(JSONResponse): |
| """JSON response using the ujson library to serialize data to JSON. |
| |
| **Deprecated**: `UJSONResponse` is deprecated. FastAPI now serializes data |
| directly to JSON bytes via Pydantic when a return type or response model is |
| set, which is faster and doesn't need a custom response class. |
| |
| Read more in the |
| [FastAPI docs for Custom Response](https://fastapi.tiangolo.com/advanced/custom-response/#orjson-or-response-model) |
| and the |
| [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). |
| |
| **Note**: `ujson` is not included with FastAPI and must be installed |
| separately, e.g. `pip install ujson`. |
| """ |
|
|
| def render(self, content: Any) -> bytes: |
| assert ujson is not None, "ujson must be installed to use UJSONResponse" |
| return ujson.dumps(content, ensure_ascii=False).encode("utf-8") |
|
|
|
|
| @deprecated( |
| "ORJSONResponse is deprecated, FastAPI now serializes data directly to JSON " |
| "bytes via Pydantic when a return type or response model is set, which is " |
| "faster and doesn't need a custom response class. Read more in the FastAPI " |
| "docs: https://fastapi.tiangolo.com/advanced/custom-response/#orjson-or-response-model " |
| "and https://fastapi.tiangolo.com/tutorial/response-model/", |
| category=FastAPIDeprecationWarning, |
| stacklevel=2, |
| ) |
| class ORJSONResponse(JSONResponse): |
| """JSON response using the orjson library to serialize data to JSON. |
| |
| **Deprecated**: `ORJSONResponse` is deprecated. FastAPI now serializes data |
| directly to JSON bytes via Pydantic when a return type or response model is |
| set, which is faster and doesn't need a custom response class. |
| |
| Read more in the |
| [FastAPI docs for Custom Response](https://fastapi.tiangolo.com/advanced/custom-response/#orjson-or-response-model) |
| and the |
| [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). |
| |
| **Note**: `orjson` is not included with FastAPI and must be installed |
| separately, e.g. `pip install orjson`. |
| """ |
|
|
| def render(self, content: Any) -> bytes: |
| assert orjson is not None, "orjson must be installed to use ORJSONResponse" |
| return orjson.dumps( |
| content, option=orjson.OPT_NON_STR_KEYS | orjson.OPT_SERIALIZE_NUMPY |
| ) |
|
|