<h3 dir="auto">First check</h3>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I added a very descriptive title to this issue.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I used the GitHub search to find a similar issue and didn't find it.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I searched the FastAPI documentation, with the integrated search.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I already searched in Google "How to X in FastAPI" and didn't find any information.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I already read and followed all the tutorial in the docs and didn't find an answer.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I already checked if it is not related to FastAPI but to <a href="https://github.com/samuelcolvin/pydantic">Pydantic</a>.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I already checked if it is not related to FastAPI but to <a href="https://github.com/swagger-api/swagger-ui">Swagger UI</a>.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I already checked if it is not related to FastAPI but to <a href="https://github.com/Redocly/redoc">ReDoc</a>.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> After submitting this, I commit to one of:
<ul dir="auto">
<li>Read open issues with questions until I find 2 issues where I can help someone and add a comment to help there.</li>
<li>I already hit the "watch" button in this repository to receive notifications and I commit to help at least 2 people that ask questions in the future.</li>
<li>Implement a Pull Request for a confirmed bug.</li>
</ul>
</li>
</ul>

<h3 dir="auto">Example</h3>
<p dir="auto">I am not sure if I am able to create a minimal example, see description below.</p>
<h3 dir="auto">Description</h3>
<p dir="auto">I have been using FastAPI for almost a year now without almost any issues, but I met one issue which is quite hard to reproduce and I might need your help.</p>
<p dir="auto">My backend (simplified), consists of two parts: the API, and the worker. The API is run by gunicorn, and the worker is run separately, to avoid creating duplicate instances of background tasks. They are communicating between each other via redis.<br>
What I have is, a background task that should mark an object (invoice) as expired after certain time.<br>
What I did is an async function, that just does <code class="notranslate">asyncio.sleep</code>, and after that it marks invoice as expired in the database.<br>
When invoice is created (from the API, via one of the workers gunicorn is serving), an asyncio task is created to mark invoice expired later.<br>
Also, the background worker on startup checks pending invoices if they have expired.<br>
Seems to be working fine even after server restarts.</p>
<p dir="auto">But in very cases it doesn't work, I have checked server logs, and saw a few entries with "<code class="notranslate">[CRITICAL] Worker timeout</code>"<br>
So as far as I understand, from time to time the workers time out and get restarted, so all started async tasks are lost.</p>
<p dir="auto">It happens quite rarely, for now 3 times: on January 4th, 10th and 17th, and every time multiple workers get restarted or get restarted multiple times.<br>
All my functions are async, and I am not sure what exactly might cause the timeout if all the long-running functions are delegated to the worker.</p>
<p dir="auto">Attaching screenshots, and all the code is available at github too.</p>
<p dir="auto">I am sorry that I am unable to provide a simple example, because the project is complex, and I think that I don't have any long-running tasks in the gunicorn process (proper distribution of tasks, this system has been working great on many systems, including the demo which is running without any issues except for this for 1 month already).</p>
<p dir="auto">I think that the issue might be just my gunicorn configuration, which is the default one almost.</p>
<p dir="auto">I understand that it might be hard to investigate the issue, so I am ready to provide all needed details and answer all the following questions in detail. I was directed here from discord.</p>
<h3 dir="auto">Environment</h3>
<ul dir="auto">
<li>OS: Linux; Docker environment with docker-compose; Custom setup:<br>
<a href="https://github.com/bitcartcc/bitcart-docker/blob/master/generator/docker-components/backend.yml">backend component</a><br>
<a href="https://github.com/bitcartcc/bitcart-docker/blob/master/generator/docker-components/worker.yml">worker component</a><br>
<a href="https://github.com/bitcartcc/bitcart-docker/blob/master/compose/backend.Dockerfile">Dockerfile</a></li>
<li>FastAPI Version: 0.63.0</li>
<li>Python version: 3.6.12</li>
</ul>
<h3 dir="auto">Additional context</h3>
<p dir="auto">The function running as an async task:<br>
<a target="_blank" rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/39452697/105222963-3ba1ff00-5b6c-11eb-9e10-44ecb35e9081.png"><img src="https://user-images.githubusercontent.com/39452697/105222963-3ba1ff00-5b6c-11eb-9e10-44ecb35e9081.png" alt="изображение" style="max-width: 100%;"></a><br>
Server logs:<br>
<a target="_blank" rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/39452697/105222977-3f358600-5b6c-11eb-914b-def7a8544379.png"><img src="https://user-images.githubusercontent.com/39452697/105222977-3f358600-5b6c-11eb-914b-def7a8544379.png" alt="изображение" style="max-width: 100%;"></a><br>
How the task is started:<br>
<a target="_blank" rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/39452697/105223484-e6b2b880-5b6c-11eb-8caa-0973a9db3e7f.png"><img src="https://user-images.githubusercontent.com/39452697/105223484-e6b2b880-5b6c-11eb-8caa-0973a9db3e7f.png" alt="изображение" style="max-width: 100%;"></a></p>
<p dir="auto"><a href="https://github.com/bitcartcc/bitcart/blob/master/gunicorn.conf.py">Gunicorn config</a>:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="import multiprocessing

bind = &quot;0.0.0.0:8000&quot;
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = &quot;uvicorn.workers.UvicornWorker&quot;"><pre class="notranslate"><code class="notranslate">import multiprocessing

bind = "0.0.0.0:8000"
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = "uvicorn.workers.UvicornWorker"
</code></pre></div>
<p dir="auto"><a href="https://github.com/bitcartcc/bitcart-docker/blob/master/compose/scripts/docker-entrypoint.sh">Backend startup script</a>:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="#!/usr/bin/env sh
set -ex
alembic upgrade head
gunicorn -c gunicorn.conf.py main:app"><pre class="notranslate"><code class="notranslate">#!/usr/bin/env sh
set -ex
alembic upgrade head
gunicorn -c gunicorn.conf.py main:app
</code></pre></div>
<p dir="auto"><a href="https://github.com/bitcartcc/bitcart/blob/master/main.py">Entrypoint</a></p>
<p dir="auto"><a href="https://github.com/bitcartcc/bitcart">Repository</a></p>
<h3 dir="auto">First check</h3>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I added a very descriptive title to this issue.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I used the GitHub search to find a similar issue and didn't find it.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I searched the FastAPI documentation, with the integrated search.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I already searched in Google "How to X in FastAPI" and didn't find any information.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I already read and followed all the tutorial in the docs and didn't find an answer.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I already checked if it is not related to FastAPI but to <a href="https://github.com/samuelcolvin/pydantic">Pydantic</a>.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I already checked if it is not related to FastAPI but to <a href="https://github.com/swagger-api/swagger-ui">Swagger UI</a>.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I already checked if it is not related to FastAPI but to <a href="https://github.com/Redocly/redoc">ReDoc</a>.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> After submitting this, I commit to one of:
<ul dir="auto">
<li>Read open issues with questions until I find 2 issues where I can help someone and add a comment to help there.</li>
<li>I already hit the "watch" button in this repository to receive notifications and I commit to help at least 2 people that ask questions in the future.</li>
<li>Implement a Pull Request for a confirmed bug.</li>
</ul>
</li>
</ul>

<h3 dir="auto">Example</h3>
<p dir="auto">Here's a self-contained, <a href="https://stackoverflow.com/help/minimal-reproducible-example" rel="nofollow">minimal, reproducible, example</a> with my use case:</p>

<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="from fastapi import WebSocket, Depends, FastAPI
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from starlette.testclient import TestClient

app = FastAPI()


@app.websocket('/')
async def socket(
    websocket: WebSocket,
    bearer_token: HTTPAuthorizationCredentials = Depends(HTTPBearer())
):
    await websocket.accept()
    await websocket.send_text(&quot;hello there&quot;)
    await websocket.close()


def test_socket():
    client = TestClient(app)
    with client.websocket_connect(&quot;/&quot;) as ws:
        ws.read_text()
        ws.close()"><pre class="notranslate"><span class="pl-k">from</span> <span class="pl-s1">fastapi</span> <span class="pl-k">import</span> <span class="pl-v">WebSocket</span>, <span class="pl-v">Depends</span>, <span class="pl-v">FastAPI</span>
<span class="pl-k">from</span> <span class="pl-s1">fastapi</span>.<span class="pl-s1">security</span> <span class="pl-k">import</span> <span class="pl-v">HTTPBearer</span>, <span class="pl-v">HTTPAuthorizationCredentials</span>
<span class="pl-k">from</span> <span class="pl-s1">starlette</span>.<span class="pl-s1">testclient</span> <span class="pl-k">import</span> <span class="pl-v">TestClient</span>

<span class="pl-s1">app</span> <span class="pl-c1">=</span> <span class="pl-v">FastAPI</span>()


<span class="pl-en">@<span class="pl-s1">app</span>.<span class="pl-en">websocket</span>(<span class="pl-s">'/'</span>)</span>
<span class="pl-k">async</span> <span class="pl-k">def</span> <span class="pl-en">socket</span>(
    <span class="pl-s1">websocket</span>: <span class="pl-v">WebSocket</span>,
    <span class="pl-s1">bearer_token</span>: <span class="pl-v">HTTPAuthorizationCredentials</span> <span class="pl-c1">=</span> <span class="pl-v">Depends</span>(<span class="pl-v">HTTPBearer</span>())
):
    <span class="pl-k">await</span> <span class="pl-s1">websocket</span>.<span class="pl-en">accept</span>()
    <span class="pl-k">await</span> <span class="pl-s1">websocket</span>.<span class="pl-en">send_text</span>(<span class="pl-s">"hello there"</span>)
    <span class="pl-k">await</span> <span class="pl-s1">websocket</span>.<span class="pl-en">close</span>()


<span class="pl-k">def</span> <span class="pl-en">test_socket</span>():
    <span class="pl-s1">client</span> <span class="pl-c1">=</span> <span class="pl-v">TestClient</span>(<span class="pl-s1">app</span>)
    <span class="pl-k">with</span> <span class="pl-s1">client</span>.<span class="pl-en">websocket_connect</span>(<span class="pl-s">"/"</span>) <span class="pl-k">as</span> <span class="pl-s1">ws</span>:
        <span class="pl-s1">ws</span>.<span class="pl-en">read_text</span>()
        <span class="pl-s1">ws</span>.<span class="pl-en">close</span>()</pre></div>
<h3 dir="auto">Description</h3>
<p dir="auto">Adding any dependency that requires additional parameters makes this endpoint crash with a <code class="notranslate">TypeError  __call__() missing 1 required positional argument: 'request'</code> when used from the <code class="notranslate">TestClient</code>.<br>
It works fine when running with uvicorn.</p>
<h4 dir="auto">Traceback:</h4>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="test_websocket_depends.py:17 (test_socket)
def test_socket():
        client = TestClient(app)
&gt;       with client.websocket_connect(&quot;/&quot;) as ws:

test_websocket_depends.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../venv/lib64/python3.8/site-packages/starlette/testclient.py:444: in websocket_connect
    super().request(&quot;GET&quot;, url, **kwargs)
../../venv/lib64/python3.8/site-packages/requests/sessions.py:530: in request
    resp = self.send(prep, **send_kwargs)
../../venv/lib64/python3.8/site-packages/requests/sessions.py:643: in send
    r = adapter.send(request, **kwargs)
../../venv/lib64/python3.8/site-packages/starlette/testclient.py:145: in send
    session = WebSocketTestSession(self.app, scope)
../../venv/lib64/python3.8/site-packages/starlette/testclient.py:277: in __init__
    message = self.receive()
../../venv/lib64/python3.8/site-packages/starlette/testclient.py:339: in receive
    raise message
../../venv/lib64/python3.8/site-packages/starlette/testclient.py:300: in _run
    self._loop.run_until_complete(self.app(scope, receive, send))
/usr/lib64/python3.8/asyncio/base_events.py:616: in run_until_complete
    return future.result()
../../venv/lib64/python3.8/site-packages/fastapi/applications.py:179: in __call__
    await super().__call__(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/applications.py:111: in __call__
    await self.middleware_stack(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/middleware/errors.py:146: in __call__
    await self.app(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/exceptions.py:58: in __call__
    await self.app(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/routing.py:566: in __call__
    await route.handle(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/routing.py:283: in handle
    await self.app(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/routing.py:57: in app
    await func(session)
../../venv/lib64/python3.8/site-packages/fastapi/routing.py:218: in app
    solved_result = await solve_dependencies(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    async def solve_dependencies(
        *,
        request: Union[Request, WebSocket],
        dependant: Dependant,
        body: Optional[Union[Dict[str, Any], FormData]] = None,
        background_tasks: Optional[BackgroundTasks] = None,
        response: Optional[Response] = None,
        dependency_overrides_provider: Optional[Any] = None,
        dependency_cache: Optional[Dict[Tuple[Callable, Tuple[str]], Any]] = None,
    ) -&gt; Tuple[
        Dict[str, Any],
        List[ErrorWrapper],
        Optional[BackgroundTasks],
        Response,
        Dict[Tuple[Callable, Tuple[str]], Any],
    ]:
        values: Dict[str, Any] = {}
        errors: List[ErrorWrapper] = []
        response = response or Response(
            content=None,
            status_code=None,  # type: ignore
            headers=None,
            media_type=None,
            background=None,
        )
        dependency_cache = dependency_cache or {}
        sub_dependant: Dependant
        for sub_dependant in dependant.dependencies:
            sub_dependant.call = cast(Callable, sub_dependant.call)
            sub_dependant.cache_key = cast(
                Tuple[Callable, Tuple[str]], sub_dependant.cache_key
            )
            call = sub_dependant.call
            use_sub_dependant = sub_dependant
            if (
                dependency_overrides_provider
                and dependency_overrides_provider.dependency_overrides
            ):
                original_call = sub_dependant.call
                call = getattr(
                    dependency_overrides_provider, &quot;dependency_overrides&quot;, {}
                ).get(original_call, original_call)
                use_path: str = sub_dependant.path  # type: ignore
                use_sub_dependant = get_dependant(
                    path=use_path,
                    call=call,
                    name=sub_dependant.name,
                    security_scopes=sub_dependant.security_scopes,
                )
                use_sub_dependant.security_scopes = sub_dependant.security_scopes
    
            solved_result = await solve_dependencies(
                request=request,
                dependant=use_sub_dependant,
                body=body,
                background_tasks=background_tasks,
                response=response,
                dependency_overrides_provider=dependency_overrides_provider,
                dependency_cache=dependency_cache,
            )
            (
                sub_values,
                sub_errors,
                background_tasks,
                _,  # the subdependency returns the same response we have
                sub_dependency_cache,
            ) = solved_result
            dependency_cache.update(sub_dependency_cache)
            if sub_errors:
                errors.extend(sub_errors)
                continue
            if sub_dependant.use_cache and sub_dependant.cache_key in dependency_cache:
                solved = dependency_cache[sub_dependant.cache_key]
            elif is_gen_callable(call) or is_async_gen_callable(call):
                stack = request.scope.get(&quot;fastapi_astack&quot;)
                if stack is None:
                    raise RuntimeError(
                        async_contextmanager_dependencies_error
                    )  # pragma: no cover
                solved = await solve_generator(
                    call=call, stack=stack, sub_values=sub_values
                )
            elif is_coroutine_callable(call):
&gt;               solved = await call(**sub_values)
E               TypeError: __call__() missing 1 required positional argument: 'request'

../../venv/lib64/python3.8/site-packages/fastapi/dependencies/utils.py:550: TypeError"><pre class="notranslate"><code class="notranslate">test_websocket_depends.py:17 (test_socket)
def test_socket():
        client = TestClient(app)
&gt;       with client.websocket_connect("/") as ws:

test_websocket_depends.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../venv/lib64/python3.8/site-packages/starlette/testclient.py:444: in websocket_connect
    super().request("GET", url, **kwargs)
../../venv/lib64/python3.8/site-packages/requests/sessions.py:530: in request
    resp = self.send(prep, **send_kwargs)
../../venv/lib64/python3.8/site-packages/requests/sessions.py:643: in send
    r = adapter.send(request, **kwargs)
../../venv/lib64/python3.8/site-packages/starlette/testclient.py:145: in send
    session = WebSocketTestSession(self.app, scope)
../../venv/lib64/python3.8/site-packages/starlette/testclient.py:277: in __init__
    message = self.receive()
../../venv/lib64/python3.8/site-packages/starlette/testclient.py:339: in receive
    raise message
../../venv/lib64/python3.8/site-packages/starlette/testclient.py:300: in _run
    self._loop.run_until_complete(self.app(scope, receive, send))
/usr/lib64/python3.8/asyncio/base_events.py:616: in run_until_complete
    return future.result()
../../venv/lib64/python3.8/site-packages/fastapi/applications.py:179: in __call__
    await super().__call__(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/applications.py:111: in __call__
    await self.middleware_stack(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/middleware/errors.py:146: in __call__
    await self.app(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/exceptions.py:58: in __call__
    await self.app(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/routing.py:566: in __call__
    await route.handle(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/routing.py:283: in handle
    await self.app(scope, receive, send)
../../venv/lib64/python3.8/site-packages/starlette/routing.py:57: in app
    await func(session)
../../venv/lib64/python3.8/site-packages/fastapi/routing.py:218: in app
    solved_result = await solve_dependencies(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    async def solve_dependencies(
        *,
        request: Union[Request, WebSocket],
        dependant: Dependant,
        body: Optional[Union[Dict[str, Any], FormData]] = None,
        background_tasks: Optional[BackgroundTasks] = None,
        response: Optional[Response] = None,
        dependency_overrides_provider: Optional[Any] = None,
        dependency_cache: Optional[Dict[Tuple[Callable, Tuple[str]], Any]] = None,
    ) -&gt; Tuple[
        Dict[str, Any],
        List[ErrorWrapper],
        Optional[BackgroundTasks],
        Response,
        Dict[Tuple[Callable, Tuple[str]], Any],
    ]:
        values: Dict[str, Any] = {}
        errors: List[ErrorWrapper] = []
        response = response or Response(
            content=None,
            status_code=None,  # type: ignore
            headers=None,
            media_type=None,
            background=None,
        )
        dependency_cache = dependency_cache or {}
        sub_dependant: Dependant
        for sub_dependant in dependant.dependencies:
            sub_dependant.call = cast(Callable, sub_dependant.call)
            sub_dependant.cache_key = cast(
                Tuple[Callable, Tuple[str]], sub_dependant.cache_key
            )
            call = sub_dependant.call
            use_sub_dependant = sub_dependant
            if (
                dependency_overrides_provider
                and dependency_overrides_provider.dependency_overrides
            ):
                original_call = sub_dependant.call
                call = getattr(
                    dependency_overrides_provider, "dependency_overrides", {}
                ).get(original_call, original_call)
                use_path: str = sub_dependant.path  # type: ignore
                use_sub_dependant = get_dependant(
                    path=use_path,
                    call=call,
                    name=sub_dependant.name,
                    security_scopes=sub_dependant.security_scopes,
                )
                use_sub_dependant.security_scopes = sub_dependant.security_scopes
    
            solved_result = await solve_dependencies(
                request=request,
                dependant=use_sub_dependant,
                body=body,
                background_tasks=background_tasks,
                response=response,
                dependency_overrides_provider=dependency_overrides_provider,
                dependency_cache=dependency_cache,
            )
            (
                sub_values,
                sub_errors,
                background_tasks,
                _,  # the subdependency returns the same response we have
                sub_dependency_cache,
            ) = solved_result
            dependency_cache.update(sub_dependency_cache)
            if sub_errors:
                errors.extend(sub_errors)
                continue
            if sub_dependant.use_cache and sub_dependant.cache_key in dependency_cache:
                solved = dependency_cache[sub_dependant.cache_key]
            elif is_gen_callable(call) or is_async_gen_callable(call):
                stack = request.scope.get("fastapi_astack")
                if stack is None:
                    raise RuntimeError(
                        async_contextmanager_dependencies_error
                    )  # pragma: no cover
                solved = await solve_generator(
                    call=call, stack=stack, sub_values=sub_values
                )
            elif is_coroutine_callable(call):
&gt;               solved = await call(**sub_values)
E               TypeError: __call__() missing 1 required positional argument: 'request'

../../venv/lib64/python3.8/site-packages/fastapi/dependencies/utils.py:550: TypeError
</code></pre></div>
<h3 dir="auto">Environment</h3>
<ul dir="auto">
<li>OS: [e.g. Linux / Windows / macOS]: Fedora 32</li>
<li>FastAPI Version [e.g. 0.3.0]: 0.61.1</li>
<li>Python version: Python 3.8.5</li>
</ul>