Ana içeriğe geç

Middleware

🌐 Translation by AI and humans

This translation was made by AI guided by humans. 🤝

It could have mistakes of misunderstanding the original meaning, or looking unnatural, etc. 🤖

You can improve this translation by helping us guide the AI LLM better.

English version

FastAPI uygulamalarına middleware ekleyebilirsiniz.

"Middleware", herhangi bir özel path operation tarafından işlenmeden önce her request ile çalışan bir fonksiyondur. Ayrıca geri döndürmeden önce her response ile de çalışır.

  • Uygulamanıza gelen her request'i alır.
  • Ardından o request üzerinde bir işlem yapabilir veya gerekli herhangi bir kodu çalıştırabilir.
  • Sonra request'i uygulamanın geri kalanı tarafından işlenmesi için iletir (bir path operation tarafından).
  • Ardından uygulama tarafından üretilen response'u alır (bir path operation tarafından).
  • Sonra o response üzerinde bir işlem yapabilir veya gerekli herhangi bir kodu çalıştırabilir.
  • Son olarak response'u döndürür.

Teknik Detaylar

yield ile dependency'leriniz varsa, çıkış (exit) kodu middleware'den sonra çalışır.

Herhangi bir background task varsa (Background Tasks bölümünde ele alınıyor, ileride göreceksiniz), bunlar tüm middleware'ler tamamlandıktan sonra çalışır.

Middleware Oluşturma

Bir middleware oluşturmak için bir fonksiyonun üzerine @app.middleware("http") decorator'ünü kullanırsınız.

Middleware fonksiyonu şunları alır:

  • request.
  • Parametre olarak request alacak bir call_next fonksiyonu.
    • Bu fonksiyon request'i ilgili path operation'a iletir.
    • Ardından ilgili path operation tarafından üretilen response'u döndürür.
  • Sonrasında response'u döndürmeden önce ayrıca değiştirebilirsiniz.
import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.perf_counter()
    response = await call_next(request)
    process_time = time.perf_counter() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

İpucu

Özel (proprietary) header'lar X- prefix'i kullanılarak eklenebilir, bunu aklınızda tutun.

Ancak tarayıcıdaki bir client'ın görebilmesini istediğiniz özel header'larınız varsa, bunları CORS konfigürasyonlarınıza (CORS (Cross-Origin Resource Sharing)) eklemeniz gerekir. Bunun için, Starlette'ın CORS dokümanlarında belgelenen expose_headers parametresini kullanın.

Teknik Detaylar

from starlette.requests import Request da kullanabilirdiniz.

FastAPI bunu geliştirici olarak size kolaylık olsun diye sunar. Ancak doğrudan Starlette'tan gelir.

response'tan Önce ve Sonra

Herhangi bir path operation request'i almadan önce, request ile birlikte çalışacak kod ekleyebilirsiniz.

Ayrıca response üretildikten sonra, geri döndürmeden önce de kod çalıştırabilirsiniz.

Örneğin, request'i işleyip response üretmenin kaç saniye sürdüğünü içeren X-Process-Time adlı özel bir header ekleyebilirsiniz:

import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.perf_counter()
    response = await call_next(request)
    process_time = time.perf_counter() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

İpucu

Burada time.time() yerine time.perf_counter() kullanıyoruz, çünkü bu kullanım senaryolarında daha hassas olabilir. 🤓

Birden Fazla Middleware Çalıştırma Sırası

@app.middleware() decorator'ü veya app.add_middleware() metodu ile birden fazla middleware eklediğinizde, eklenen her yeni middleware uygulamayı sarar ve bir stack oluşturur. En son eklenen middleware en dıştaki (outermost), ilk eklenen ise en içteki (innermost) olur.

Request tarafında önce en dıştaki middleware çalışır.

Response tarafında ise en son o çalışır.

Örneğin:

app.add_middleware(MiddlewareA)
app.add_middleware(MiddlewareB)

Bu, aşağıdaki çalıştırma sırasını oluşturur:

  • Request: MiddlewareB → MiddlewareA → route

  • Response: route → MiddlewareA → MiddlewareB

Bu stack davranışı, middleware'lerin öngörülebilir ve kontrol edilebilir bir sırayla çalıştırılmasını sağlar.

Diğer Middleware'ler

Diğer middleware'ler hakkında daha fazlasını daha sonra Advanced User Guide: Advanced Middleware bölümünde okuyabilirsiniz.

Bir sonraki bölümde, middleware ile CORS'un nasıl ele alınacağını göreceksiniz.