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.
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
requestalacak bircall_nextfonksiyonu.- Bu fonksiyon
request'i ilgili path operation'a iletir. - Ardından ilgili path operation tarafından üretilen
response'u döndürür.
- Bu fonksiyon
- 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.