Antipasti
- FastAPI nedir?0:50
- Margherita: Hello World0:50
Python Pizza İstanbul · 14 Kasım 2026
10 dakikada FastAPI’nin temelleri. Soğumadan servis.
Tam ekranda açılır. Ok tuşları ya da sunum kumandasıyla ilerle.
Birine tıkla, sunum o slayttan açılsın.
10 dakika, 14 slayt, sıfır ananas.
PYTHON PIZZA İSTANBUL · 14 KASIM 2026
10 dakikada, soğumadan.
Bugünün menüsü
Modern, hızlı, tip ipuçlarına dayalı bir Python web framework’ü.
otomatik dokümantasyon
hepsini birbirine bağlayan
veri doğrulama ve serileştirme
ASGI, routing, async
Üç satır, çalışan bir API.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root() -> dict[str, str]:
return {"message": "Merhaba Python Pizza! 🍕"} $ uv run fastapi dev examples/01_hello.py ⚡️ Starting FastAPI in development mode 🌐 Server started at http://127.0.0.1:8000 Documentation at http://127.0.0.1:8000/docs
{
"message": "Merhaba Python Pizza! 🍕"
} Veri nereden gelir? Tek fonksiyon, dört kaynak.
@app.post("/pizzas/{pizza_id}/orders")
async def order_pizza(
pizza_id: int, # path
order: Order, # body
extra_cheese: bool = False, # query
x_table_no: Annotated[int | None, Header()] = None, # header
) -> dict[str, object]:
return {
"pizza_id": pizza_id,
"extra_cheese": extra_cheese,
"table": x_table_no,
"order": order,
} /pizzas/3/orders → pizza_id = 3 ?extra_cheese=true → extra_cheese = True X-Table-No: 7 → x_table_no = 7 {"customer": "Ayşe", "quantity": 2} → order = Order(…) 422 pizza_id: int → /pizzas/abc isteği, fonksiyon çalışmadan reddedilir.
Doğrulama kodu yazmadık. Ananas yine de reddedildi.
class Topping(StrEnum):
mozzarella = "mozzarella"
pepperoni = "pepperoni"
mushroom = "mushroom"
basil = "basil" # pineapple? not on this menu!
class PizzaCreate(BaseModel):
name: str = Field(min_length=2, max_length=40)
price: int = Field(gt=0)
toppings: list[Topping] = Field(min_length=1) /pizzasGeçerli istek{"name": "Margherita", "price": 190, "toppings": ["mozzarella", "basil"]}{
"name": "Margherita",
"price": 190,
"toppings": ["mozzarella", "basil"]
}/pizzasAnanaslı istek{"name": "Hawaii", "price": 200, "toppings": ["mozzarella", "ananas"]}{
"detail": [{
"loc": ["body", "toppings", 1],
"msg": "Input should be 'mozzarella', 'pepperoni', 'mushroom' or 'basil'",
"input": "ananas"
}]
}Tek satır dokümantasyon yazmadan.
/docs Swagger UI /redoc ReDoc /openapi.json makine dostu şema
Şef sadece pizza yapar. Malzemeyi mutfak getirir.
def pagination(limit: int = 10, offset: int = 0) -> dict[str, int]:
return {"limit": limit, "offset": offset}
Pagination = Annotated[dict[str, int], Depends(pagination)]
@app.get("/menu")
async def menu(page: Pagination): ...
def require_chef(x_api_key: Annotated[str | None, Header()] = None):
if x_api_key != "chef-secret":
raise HTTPException(401, "Only the chef can do that 👨🍳")
@app.delete("/menu/{name}", dependencies=[Depends(require_chef)])
async def remove(name: str): ... yield = iş bitince temizlik. Bulaşıkları FastAPI yıkar 🧽
pagination() limit & offset require_chef() yetki kontrolü get_db() veritabanı oturumu async def get_db() -> AsyncIterator[AsyncSession]:
async with SessionLocal() as session:
yield session Aynı anda 3 sipariş. Garson kaç tane?
@app.get("/bake/async")
async def bake_async():
await asyncio.sleep(BAKE_SECONDS) # waiter serves other tables ✅
@app.get("/bake/blocking")
async def bake_blocking():
time.sleep(BAKE_SECONDS) # waiter freezes at the oven ❌
@app.get("/bake/threadpool")
def bake_threadpool():
time.sleep(BAKE_SECONDS) # `def` runs in a thread pool ✅ ⏱ Gerçek ölçüm: 3 eşzamanlı istek
awaitfırını beklerken başka masaya bakdefFastAPI seni thread havuzuna koyarasync def + time.sleep()garson fırının önünde donarİstek yukarıdan aşağı akar.
fastapi-pizza/
TestClient: sunucu açmadan, saniyeler içinde.
def test_pineapple_is_rejected(client: TestClient, chef: dict[str, str]) -> None:
body = {"name": "Hawaii", "price": 200, "toppings": ["mozzarella", "ananas"]}
response = client.post(URL, json=body, headers=chef)
assert response.status_code == 422
error = response.json()["detail"][0]
assert error["loc"] == ["body", "toppings", 1]
assert error["input"] == "ananas"
assert client.get(URL).json() == [] # nothing was created $ uv run pytest -v tests/test_pizzas.py::test_pizza_id_must_be_an_int PASSED [ 65%] tests/test_pizzas.py::test_pineapple_is_rejected PASSED [ 70%] ============================== 44 passed in 2.07s ==============================
Yerelden yayına üç komut.
$ fastapi dev geliştirme otomatik yeniden yükleme
$ fastapi run üretim tek komut, hazır sunucu
$ fastapi deploy FastAPI Cloud tek komutla yayında
Docker ya da kendi sunucunda uvicorn da olur.
14 Kasım 2026 · StartGate, Maslak, İstanbul
Bahşiş: repoya ⭐
Sorular? (Ananas hariç.)
python-pizza.erhan.dev github.com/erhan/fastapi-pizza