Browse Source

Fix optional orjson/ujson import breaking fastapi.responses

Catches ImportError instead of ModuleNotFoundError to handle cases where the package exists but its C-extension fails to load.
pull/15537/head
Amandeep vishwkarma 3 weeks ago
parent
commit
07adddd171
  1. 4
      fastapi/responses.py
  2. 26
      tests/test_responses_optional_imports.py

4
fastapi/responses.py

@ -26,13 +26,13 @@ class _OrjsonModule(Protocol):
try:
ujson = cast(_UjsonModule, importlib.import_module("ujson"))
except ModuleNotFoundError: # pragma: nocover
except ImportError: # pragma: nocover
ujson = None # type: ignore[assignment]
try:
orjson = cast(_OrjsonModule, importlib.import_module("orjson"))
except ModuleNotFoundError: # pragma: nocover
except ImportError: # pragma: nocover
orjson = None # type: ignore[assignment]

26
tests/test_responses_optional_imports.py

@ -0,0 +1,26 @@
import importlib
import sys
from typing import Any
import pytest
def test_optional_imports_broken_installation(monkeypatch: pytest.MonkeyPatch) -> None:
"""
Test that an ImportError during the import of an optional JSON library
(like orjson or ujson) does not crash the entire fastapi.responses module.
"""
real_import_module = importlib.import_module
def fake_import_module(name: str, package: str | None = None) -> Any:
if name in ("ujson", "orjson"):
raise ImportError(f"simulated binary/load failure for {name}")
return real_import_module(name, package)
monkeypatch.setattr(importlib, "import_module", fake_import_module)
# Force a reload to ensure the module initialization runs with our monkeypatch
if "fastapi.responses" in sys.modules:
del sys.modules["fastapi.responses"]
# This should not raise an ImportError
import fastapi.responses # noqa: F401
Loading…
Cancel
Save