You register one function per method with the matching path operation decorator, such as @app.get or @app.post. FastAPI has a decorator for every HTTP method, including the less common @app.patch and @app.options. The same path can carry several methods, each handled by its own function, so /items/{item_id} below answers both PUT and DELETE.
from fastapi import FastAPI
app = FastAPI()
@app.get("/items")
def get_items():
return {"method": "GET"}
@app.post("/items")
def create_item():
return {"method": "POST"}
@app.put("/items/{item_id}")
def update_item(item_id: int):
return {"method": "PUT", "item_id": item_id}
@app.delete("/items/{item_id}")
def delete_item(item_id: int):
return {"method": "DELETE", "item_id": item_id}
FastAPI matches a request on the path and the method together. A method with no function on a known path gets a 405 Method Not Allowed response without any code from you. Each decorator also adds that operation to the generated OpenAPI docs.
When one function must serve several methods, @app.api_route takes a methods list. Separate functions are usually better, because each handler stays small and easier to test.
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.
Why there's no diagram: “”
The interactive diagram is below the answer - jump to diagram ↓ · Below it, the related concept . Jump to it ↓
The diagram below the answer is the concept . Jump to it ↓