FastAPI তে Middleware ব্যবহার করা হয় বিভিন্ন ধরনের টাস্ক যেমন লগিং, রিকোয়েস্ট এবং রেসপন্স মডিফিকেশন, সিকিউরিটি চেক ইত্যাদি করার জন্য। Custom Middleware তৈরি করা খুবই সহজ এবং এর মাধ্যমে আপনি FastAPI অ্যাপ্লিকেশনের কার্যক্ষমতা এবং নিরাপত্তা বাড়াতে পারেন।
এখানে, আমরা দেখব কিভাবে FastAPI-তে Custom Middleware তৈরি এবং কনফিগার করা যায়।
Middleware কী?
Middleware হল একটি ফাংশন বা ক্লাস যা HTTP রিকোয়েস্ট আসার আগে এবং HTTP রেসপন্স ফেরানোর পরে কার্যকর হয়। FastAPI তে Middleware ব্যবহারের মাধ্যমে আপনি রিকোয়েস্ট প্রসেসিংয়ের প্রক্রিয়া পরিবর্তন করতে বা অতিরিক্ত কাজ (যেমন লগিং, অথেনটিকেশন) করতে পারেন।
FastAPI তে Middleware সাধারণত দুটি পদ্ধতিতে কাজ করে:
- Before Request: রিকোয়েস্ট আসার আগে কিছু কার্যকলাপ সম্পাদন করা।
- After Response: রেসপন্স ফেরানোর আগে বা পরে কিছু কার্যকলাপ সম্পাদন করা।
Step 1: Custom Middleware তৈরি করা
Custom Middleware তৈরি করতে, FastAPI তে BaseHTTPMiddleware ক্লাস ব্যবহার করতে হয়, যা starlette.middleware.base থেকে আসে। এর মাধ্যমে আমরা dispatch মেথড ওভাররাইড করে Middleware তৈরি করতে পারি।
উদাহরণ: Simple Logging Middleware
from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
import time
class LoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
print(f"Request processed in {process_time} seconds")
return response
app = FastAPI()
# Custom Middleware যোগ করা
app.add_middleware(LoggingMiddleware)
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
এখানে:
LoggingMiddlewareএকটি Custom Middleware যা রিকোয়েস্ট প্রোসেস করার সময় কতটা সময় লাগছে তা লগ করে।call_nextব্যবহার করে রিকোয়েস্ট প্রসেস করার পরে রেসপন্সটি ফেরত দেওয়া হয়।start_timeএবংprocess_timeব্যবহার করে মোট প্রসেসিং সময় বের করা হচ্ছে।
রিকোয়েস্ট উদাহরণ:
GET /
রেসপন্স:
{
"message": "Hello, World!"
}
লগ:
Request processed in 0.0003 seconds
Step 2: Request এবং Response Manipulation Middleware
Custom Middleware ব্যবহার করে আপনি Request এবং Response উভয়কে ম্যানিপুলেট করতে পারেন। উদাহরণস্বরূপ, আপনি রিকোয়েস্ট হেডার বা রেসপন্স কন্টেন্ট পরিবর্তন করতে পারেন।
উদাহরণ: Custom Header Add করা Middleware
from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import Response
class AddCustomHeaderMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
response: Response = await call_next(request)
response.headers["X-Custom-Header"] = "This is a custom header"
return response
app = FastAPI()
# Custom Middleware যোগ করা
app.add_middleware(AddCustomHeaderMiddleware)
@app.get("/")
def read_root():
return {"message": "Custom header added!"}
এখানে:
AddCustomHeaderMiddlewareএকটি Middleware যা রেসপন্সেX-Custom-Headerযোগ করে।call_nextরিকোয়েস্ট প্রসেস করার পর, রেসপন্সে কাস্টম হেডারটি যোগ করা হচ্ছে।
রিকোয়েস্ট উদাহরণ:
GET /
রেসপন্স:
{
"message": "Custom header added!"
}
Response Header:
X-Custom-Header: This is a custom header
Step 3: Error Handling Middleware
Middleware ব্যবহার করে আপনি Error Handlingও করতে পারেন, যেমন রিকোয়েস্ট প্রোসেস করার সময় কোনো ত্রুটি হলে তা হ্যান্ডেল করা।
উদাহরণ: Custom Error Handling Middleware
from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import JSONResponse
class ErrorHandlingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
try:
response = await call_next(request)
return response
except Exception as e:
return JSONResponse(
status_code=500,
content={"detail": f"An error occurred: {str(e)}"}
)
app = FastAPI()
# Custom Middleware যোগ করা
app.add_middleware(ErrorHandlingMiddleware)
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
@app.get("/error")
def cause_error():
raise Exception("Something went wrong!")
এখানে:
ErrorHandlingMiddlewareএকটি Custom Middleware যা যে কোনো ত্রুটি ধরবে এবং একটি কাস্টম JSON রেসপন্স ফেরত দেবে।
রিকোয়েস্ট উদাহরণ:
GET /error
রেসপন্স (ত্রুটি):
{
"detail": "An error occurred: Something went wrong!"
}
Step 4: Dependency Injection Middleware
FastAPI তে Middleware ব্যবহার করে আপনি Dependency Injection করতে পারেন। উদাহরণস্বরূপ, আপনি একটি নির্দিষ্ট ডিপেনডেন্সি ইনজেক্ট করতে পারেন যা Middleware এর মধ্যে কাজ করবে।
উদাহরণ: Dependency Injection Middleware
from fastapi import FastAPI, Depends
from starlette.middleware.base import BaseHTTPMiddleware
class DependencyInjectionMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
# Dependency Injection: Adding a custom value to the request state
request.state.custom_value = "Injected Value"
response = await call_next(request)
return response
app = FastAPI()
# Custom Middleware যোগ করা
app.add_middleware(DependencyInjectionMiddleware)
@app.get("/")
def read_root(request: Request):
return {"message": f"Custom value: {request.state.custom_value}"}
এখানে:
request.state.custom_valueব্যবহার করে Middleware তে ডিপেনডেন্সি ইনজেক্ট করা হয়েছে এবং তা পরে রিকোয়েস্টে ব্যবহৃত হচ্ছে।
রিকোয়েস্ট উদাহরণ:
GET /
রেসপন্স:
{
"message": "Custom value: Injected Value"
}
Step 5: Configuring Middleware Order
FastAPI তে আপনি Middleware Order কনফিগার করতে পারেন, অর্থাৎ কোন Middleware প্রথমে কার্যকর হবে এবং কোনটি পরে। Middleware এর কার্যক্রম নির্ধারণ করতে এটি গুরুত্বপূর্ণ হতে পারে।
from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
class FirstMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
print("First Middleware")
response = await call_next(request)
return response
class SecondMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
print("Second Middleware")
response = await call_next(request)
return response
app = FastAPI()
# Middleware গুলি যোগ করা
app.add_middleware(FirstMiddleware)
app.add_middleware(SecondMiddleware)
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
এখানে, FirstMiddleware প্রথমে কার্যকর হবে, তারপর SecondMiddleware।
রিকোয়েস্ট উদাহরণ:
GET /
কনসোল আউটপুট:
First Middleware
Second Middleware
FastAPI তে Custom Middleware তৈরি করা এবং কনফিগার করা খুবই সহজ। Middleware ব্যবহার করে আপনি বিভিন্ন ধরনের কাজ করতে পারেন, যেমন লগিং, রিকোয়েস্ট এবং রেসপন্স মডিফিকেশন, সিকিউরিটি চেক ইত্যাদি। Middleware ব্যবস্থাপনা ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনের কার্যক্ষমতা, নিরাপত্তা এবং মান উন্নত করতে পারেন।
Read more