From f108c53775d93582d30eab73e94e5bbf4af0baf7 Mon Sep 17 00:00:00 2001 From: Philipp Date: Mon, 11 Aug 2025 19:52:49 +0200 Subject: [PATCH 1/3] Add materials for the "Get Started With FastAPI tutorial" --- fastapi/README.md | 15 ++++++++++++++ fastapi/books_api.py | 43 ++++++++++++++++++++++++++++++++++++++++ fastapi/main.py | 7 +++++++ fastapi/requirements.txt | 39 ++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 fastapi/README.md create mode 100644 fastapi/books_api.py create mode 100644 fastapi/main.py create mode 100644 fastapi/requirements.txt diff --git a/fastapi/README.md b/fastapi/README.md new file mode 100644 index 0000000000..c6dd0e70ca --- /dev/null +++ b/fastapi/README.md @@ -0,0 +1,15 @@ +# Get Started With FastAPI + +This repository contains code snippets discussed in the associated tutorial on [Get Started With FastAPI](https://realpython.com/get-started-with-fastapi/). + +## Installation + +The recommended way to install FastAPI is with the `[standard]` extra dependencies. This ensures you get all the tools you need for developing an API without having to hunt down additional packages later: + +```console +$ python -m pip install "fastapi[standard]" +``` + +The quotes around `"fastapi[standard]"` ensure the command works correctly across different [terminals](https://realpython.com/terminal-commands/) and operating systems. With the command above you install several useful packages, including the [FastAPI CLI](https://fastapi.tiangolo.com/fastapi-cli/) and [uvicorn](https://www.uvicorn.org/), an ASGI server for running your application. + +You can also use the `requirements.txt` file in this folder and run `python -m pip install -r requirements.txt` to install the standard dependencies of FastAPI. diff --git a/fastapi/books_api.py b/fastapi/books_api.py new file mode 100644 index 0000000000..32c6027934 --- /dev/null +++ b/fastapi/books_api.py @@ -0,0 +1,43 @@ +from typing import Optional + +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + +books = [ + {"id": 1, "title": "Python Basics", "author": "Real P.", "pages": 635}, + {"id": 2, "title": "Breaking the Rules", "author": "Stephen G.", "pages": 99}, +] + +class Book(BaseModel): + title: str + author: str + pages: int + +@app.get("/books") +def get_books(limit: Optional[int] = None): + """Get all books, optionally limited by count.""" + if limit: + return {"books": books[:limit]} + return {"books": books} + +@app.get("/books/{book_id}") +def get_book(book_id: int): + """Get a specific book by ID.""" + for book in books: + if book["id"] == book_id: + return book + return {"error": "Book not found"} + +@app.post("/books") +def create_book(book: Book): + """Create a new book entry.""" + new_book = { + "id": len(books) + 1, + "title": book.title, + "author": book.author, + "pages": book.pages + } + books.append(new_book) + return new_book diff --git a/fastapi/main.py b/fastapi/main.py new file mode 100644 index 0000000000..7d44e7a44c --- /dev/null +++ b/fastapi/main.py @@ -0,0 +1,7 @@ +from fastapi import FastAPI + +app = FastAPI() + +@app.get("/") +def home(): + return {"message": "Hello, FastAPI!"} diff --git a/fastapi/requirements.txt b/fastapi/requirements.txt new file mode 100644 index 0000000000..5a7d3b17b5 --- /dev/null +++ b/fastapi/requirements.txt @@ -0,0 +1,39 @@ +annotated-types==0.7.0 +anyio==4.10.0 +certifi==2025.8.3 +click==8.2.1 +dnspython==2.7.0 +email_validator==2.2.0 +fastapi==0.116.1 +fastapi-cli==0.0.8 +fastapi-cloud-cli==0.1.5 +h11==0.16.0 +httpcore==1.0.9 +httptools==0.6.4 +httpx==0.28.1 +idna==3.10 +Jinja2==3.1.6 +markdown-it-py==4.0.0 +MarkupSafe==3.0.2 +mdurl==0.1.2 +pydantic==2.11.7 +pydantic_core==2.33.2 +Pygments==2.19.2 +python-dotenv==1.1.1 +python-multipart==0.0.20 +PyYAML==6.0.2 +rich==14.1.0 +rich-toolkit==0.15.0 +rignore==0.6.4 +sentry-sdk==2.34.1 +shellingham==1.5.4 +sniffio==1.3.1 +starlette==0.47.2 +typer==0.16.0 +typing-inspection==0.4.1 +typing_extensions==4.14.1 +urllib3==2.5.0 +uvicorn==0.35.0 +uvloop==0.21.0 +watchfiles==1.1.0 +websockets==15.0.1 From 2c4f66ad376c1ab82e3834822d06ec7f93a9bc75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Zaczy=C5=84ski?= Date: Tue, 12 Aug 2025 10:05:26 +0200 Subject: [PATCH 2/3] Reformat code --- fastapi/books_api.py | 16 +++++++++++++--- fastapi/main.py | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/fastapi/books_api.py b/fastapi/books_api.py index 32c6027934..4ef3da705c 100644 --- a/fastapi/books_api.py +++ b/fastapi/books_api.py @@ -1,20 +1,28 @@ from typing import Optional -from fastapi import FastAPI from pydantic import BaseModel +from fastapi import FastAPI + app = FastAPI() books = [ {"id": 1, "title": "Python Basics", "author": "Real P.", "pages": 635}, - {"id": 2, "title": "Breaking the Rules", "author": "Stephen G.", "pages": 99}, + { + "id": 2, + "title": "Breaking the Rules", + "author": "Stephen G.", + "pages": 99, + }, ] + class Book(BaseModel): title: str author: str pages: int + @app.get("/books") def get_books(limit: Optional[int] = None): """Get all books, optionally limited by count.""" @@ -22,6 +30,7 @@ def get_books(limit: Optional[int] = None): return {"books": books[:limit]} return {"books": books} + @app.get("/books/{book_id}") def get_book(book_id: int): """Get a specific book by ID.""" @@ -30,6 +39,7 @@ def get_book(book_id: int): return book return {"error": "Book not found"} + @app.post("/books") def create_book(book: Book): """Create a new book entry.""" @@ -37,7 +47,7 @@ def create_book(book: Book): "id": len(books) + 1, "title": book.title, "author": book.author, - "pages": book.pages + "pages": book.pages, } books.append(new_book) return new_book diff --git a/fastapi/main.py b/fastapi/main.py index 7d44e7a44c..572c4f340d 100644 --- a/fastapi/main.py +++ b/fastapi/main.py @@ -2,6 +2,7 @@ app = FastAPI() + @app.get("/") def home(): return {"message": "Hello, FastAPI!"} From 863a59d87615cedbe9ba115029584745e366cc12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Zaczy=C5=84ski?= Date: Tue, 12 Aug 2025 10:25:27 +0200 Subject: [PATCH 3/3] Sort imports with Ruff --- crud-operations/crud_fastapi.py | 3 ++- .../source_code_final/shortener_app/main.py | 5 +++-- .../source_code_step_2/shortener_app/main.py | 3 ++- .../source_code_step_3/shortener_app/main.py | 3 ++- langchain-rag-app/source_code_final/chatbot_api/src/main.py | 3 ++- langchain-rag-app/source_code_step_5/chatbot_api/src/main.py | 3 ++- python-serialize/http-payload/fastapi-rest-api/main.py | 3 ++- python-yaml/formatter/server.py | 3 ++- 8 files changed, 17 insertions(+), 9 deletions(-) diff --git a/crud-operations/crud_fastapi.py b/crud-operations/crud_fastapi.py index d8a00c0b40..42ddcbd97c 100644 --- a/crud-operations/crud_fastapi.py +++ b/crud-operations/crud_fastapi.py @@ -1,10 +1,11 @@ from crud_sql_alchemy import Bird, init_db from crud_sql_alchemy import Session as SessionLocal -from fastapi import Depends, FastAPI, HTTPException from pydantic import BaseModel, ConfigDict from sqlalchemy import select from sqlalchemy.orm import Session +from fastapi import Depends, FastAPI, HTTPException + app = FastAPI() init_db() diff --git a/fastapi-url-shortener/source_code_final/shortener_app/main.py b/fastapi-url-shortener/source_code_final/shortener_app/main.py index a3e11c326d..84fa1ea688 100644 --- a/fastapi-url-shortener/source_code_final/shortener_app/main.py +++ b/fastapi-url-shortener/source_code_final/shortener_app/main.py @@ -1,9 +1,10 @@ import validators -from fastapi import Depends, FastAPI, HTTPException, Request -from fastapi.responses import RedirectResponse from sqlalchemy.orm import Session from starlette.datastructures import URL +from fastapi import Depends, FastAPI, HTTPException, Request +from fastapi.responses import RedirectResponse + from . import crud, models, schemas from .config import get_settings from .database import SessionLocal, engine diff --git a/fastapi-url-shortener/source_code_step_2/shortener_app/main.py b/fastapi-url-shortener/source_code_step_2/shortener_app/main.py index 8915ef537c..5f68a9cea2 100644 --- a/fastapi-url-shortener/source_code_step_2/shortener_app/main.py +++ b/fastapi-url-shortener/source_code_step_2/shortener_app/main.py @@ -1,9 +1,10 @@ import secrets import validators +from sqlalchemy.orm import Session + from fastapi import Depends, FastAPI, HTTPException, Request from fastapi.responses import RedirectResponse -from sqlalchemy.orm import Session from . import models, schemas from .database import SessionLocal, engine diff --git a/fastapi-url-shortener/source_code_step_3/shortener_app/main.py b/fastapi-url-shortener/source_code_step_3/shortener_app/main.py index f13f2adcc9..85d9e74cbb 100644 --- a/fastapi-url-shortener/source_code_step_3/shortener_app/main.py +++ b/fastapi-url-shortener/source_code_step_3/shortener_app/main.py @@ -1,7 +1,8 @@ import validators +from sqlalchemy.orm import Session + from fastapi import Depends, FastAPI, HTTPException, Request from fastapi.responses import RedirectResponse -from sqlalchemy.orm import Session from . import crud, models, schemas from .database import SessionLocal, engine diff --git a/langchain-rag-app/source_code_final/chatbot_api/src/main.py b/langchain-rag-app/source_code_final/chatbot_api/src/main.py index 2b40ecb4b9..22538627d4 100644 --- a/langchain-rag-app/source_code_final/chatbot_api/src/main.py +++ b/langchain-rag-app/source_code_final/chatbot_api/src/main.py @@ -1,8 +1,9 @@ from agents.hospital_rag_agent import hospital_rag_agent_executor -from fastapi import FastAPI from models.hospital_rag_query import HospitalQueryInput, HospitalQueryOutput from utils.async_utils import async_retry +from fastapi import FastAPI + app = FastAPI( title="Hospital Chatbot", description="Endpoints for a hospital system graph RAG chatbot", diff --git a/langchain-rag-app/source_code_step_5/chatbot_api/src/main.py b/langchain-rag-app/source_code_step_5/chatbot_api/src/main.py index 2b40ecb4b9..22538627d4 100644 --- a/langchain-rag-app/source_code_step_5/chatbot_api/src/main.py +++ b/langchain-rag-app/source_code_step_5/chatbot_api/src/main.py @@ -1,8 +1,9 @@ from agents.hospital_rag_agent import hospital_rag_agent_executor -from fastapi import FastAPI from models.hospital_rag_query import HospitalQueryInput, HospitalQueryOutput from utils.async_utils import async_retry +from fastapi import FastAPI + app = FastAPI( title="Hospital Chatbot", description="Endpoints for a hospital system graph RAG chatbot", diff --git a/python-serialize/http-payload/fastapi-rest-api/main.py b/python-serialize/http-payload/fastapi-rest-api/main.py index 4d447c281a..484758c518 100644 --- a/python-serialize/http-payload/fastapi-rest-api/main.py +++ b/python-serialize/http-payload/fastapi-rest-api/main.py @@ -1,9 +1,10 @@ from datetime import datetime from uuid import UUID, uuid4 -from fastapi import FastAPI from pydantic import BaseModel, Field +from fastapi import FastAPI + app = FastAPI() diff --git a/python-yaml/formatter/server.py b/python-yaml/formatter/server.py index 9eefe67c8e..35cd3fb492 100644 --- a/python-yaml/formatter/server.py +++ b/python-yaml/formatter/server.py @@ -9,10 +9,11 @@ from typing import Optional import yaml +from pydantic import BaseModel + from fastapi import FastAPI from fastapi.responses import HTMLResponse, JSONResponse from fastapi.staticfiles import StaticFiles -from pydantic import BaseModel TEST_DATA = { "person": {