Skip to main content
FastAPI Docs

Search documentation

Type to search this documentation.

On this pageOverview

Using the Request Directly

Up to now, you have been declaring the parts of the request that you need with their types.

Taking data from:

  • The path as parameters.
  • Headers.
  • Cookies.
  • etc.

And by doing so, FastAPI is validating that data, converting it and generating documentation for your API automatically.

But there are situations where you might need to access the Request object directly.

As FastAPI is actually Starlette underneath, with a layer of several tools on top, you can use Starlette's Request object directly when you need to.

It would also mean that if you get data from the Request object directly (for example, read the body) it won't be validated, converted or documented (with OpenAPI, for the automatic API user interface) by FastAPI.

Although any other parameter declared normally (for example, the body with a Pydantic model) would still be validated, converted, annotated, etc.

But there are specific cases where it's useful to get the Request object.

Let's imagine you want to get the client's IP address/host inside of your path operation function.

For that you need to access the request directly.

Python
from fastapi import FastAPI, Request

app = FastAPI()


@app.get("/items/{item_id}")
def read_root(item_id: str, request: Request):
    client_host = request.client.host
    return {"client_host": client_host, "item_id": item_id}

By declaring a path operation function parameter with the type being the Request FastAPI will know to pass the Request in that parameter.

You can read more details about the Request object in the official Starlette documentation site.

Suggest an edit

Propose a replacement for this page. The site team reviews it before applying any changes.

Export
Documentation menu