Request এবং Response Lifecycle হ্যান্ডলিং হলো FastAPI-তে রিকোয়েস্ট গ্রহণ থেকে শুরু করে রেসপন্স পাঠানোর পর্যায় পর্যন্ত সবকিছু নিয়ন্ত্রণ করার প্রক্রিয়া। FastAPI তে এটি Middleware এবং Dependency Injection ব্যবহার করে সহজেই করা যায়। Middleware এবং Life Cycle হ্যান্ডলিংয়ের মাধ্যমে আপনি রিকোয়েস্ট এবং রেসপন্সে প্রি-প্রসেসিং বা পোস্ট-প্রসেসিং কার্যকর করতে পারেন।
এখানে, আমরা ফাস্টএপিআইতে রিকোয়েস্ট এবং রেসপন্স লাইফসাইকেল কিভাবে হ্যান্ডল করা যায় তা দেখব।
Step 1: Middleware সম্পর্কে
Middleware হলো ফাস্টএপিআইতে এমন একটি ফাংশন বা ক্লাস যা রিকোয়েস্ট এবং রেসপন্স এর মধ্যবর্তী পর্যায়ে কার্যকর হয়। Middleware ব্যবহার করে আপনি রিকোয়েস্ট প্রোসেসিং এবং রেসপন্স মডিফিকেশন করতে পারেন।
Custom Middleware তৈরি করা
FastAPI তে middleware তৈরি করার জন্য BaseHTTPMiddleware অথবা Middleware ক্লাস ব্যবহার করা যায়। এখানে আমরা একটি Custom Middleware তৈরি করব।
from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
app = FastAPI()
class CustomMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
# Request প্রোসেসিং
print("Request received")
# রিকোয়েস্ট প্রসেস করা হচ্ছে
response = await call_next(request)
# Response প্রোসেসিং
response.headers['X-Custom-Header'] = 'Custom Value'
print("Response sent")
return response
# Middleware যুক্ত করা
app.add_middleware(CustomMiddleware)
@app.get("/")
async def read_root():
return {"message": "Hello, FastAPI!"}
এখানে:
dispatchমেথডটি রিকোয়েস্ট এবং রেসপন্সের মধ্যবর্তী প্রক্রিয়া নিয়ন্ত্রণ করে।call_next(request)ব্যবহার করে রিকোয়েস্ট পরবর্তী পর্যায়ে প্রোসেস করা হয়।X-Custom-Headerহেডারটি রেসপন্সে যুক্ত করা হয়েছে।
রিকোয়েস্ট এবং রেসপন্স লাইফসাইকেল:
- রিকোয়েস্ট আসার আগে
CustomMiddlewareকাজ করবে। - রেসপন্স পাঠানোর আগে middleware রেসপন্সে কাস্টম হেডার যুক্ত করবে।
Step 2: Request Lifecycle Handling
Request Lifecycle হ্যান্ডল করার জন্য আপনি middleware ব্যবহার করতে পারেন, যেখানে আপনি রিকোয়েস্টের বিভিন্ন বৈশিষ্ট্য যেমন হেডার, বডি ইত্যাদি প্রসেস করতে পারবেন।
Request Lifecycle Handling উদাহরণ:
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def log_request(request: Request, call_next):
# Request lifecycle - Pre-processing
print(f"Request path: {request.url.path}")
# Request প্রসেসিং
response = await call_next(request)
# Response lifecycle - Post-processing
print(f"Response status code: {response.status_code}")
return response
এখানে, log_request middleware রিকোয়েস্ট এবং রেসপন্সের তথ্য লগ করবে।
রিকোয়েস্ট এবং রেসপন্স লাইফসাইকেল:
- Pre-processing: রিকোয়েস্টের URL পাথ লগ করা হবে।
- Post-processing: রেসপন্সের স্ট্যাটাস কোড লগ করা হবে।
Step 3: Response Lifecycle Handling
Response Lifecycle হ্যান্ডল করার জন্য আপনি রেসপন্সে কাস্টম হেডার বা কন্টেন্ট মডিফাই করতে পারেন। FastAPI তে রেসপন্স তৈরি করার পর এটি শেষ না হওয়া পর্যন্ত আমরা রেসপন্সে কিছু পরিবর্তন করতে পারি।
Response Lifecycle Handling উদাহরণ:
from fastapi import FastAPI
from starlette.responses import JSONResponse
app = FastAPI()
@app.middleware("http")
async def add_custom_header(request, call_next):
response = await call_next(request)
# Response lifecycle - Post-processing
response.headers['X-Processed-By'] = 'FastAPI Middleware'
return response
@app.get("/")
async def read_root():
return JSONResponse(content={"message": "Hello, FastAPI!"})
এখানে, X-Processed-By হেডার রেসপন্সে যোগ করা হয়েছে। এটি middleware এর মাধ্যমে করা হয়েছে।
রিকোয়েস্ট এবং রেসপন্স লাইফসাইকেল:
- Pre-processing: রিকোয়েস্ট আসার পর কিছু ম্যানিপুলেশন করা যায়।
- Post-processing: রেসপন্স আসার পর হেডার বা কন্টেন্ট পরিবর্তন করা যায়।
Step 4: Request Validation and Error Handling
FastAPI তে Request Validation এবং Error Handling খুবই সহজ। আপনি পিডেন্টিক (Pydantic) মডেল ব্যবহার করে ইনপুট ডাটা ভ্যালিডেশন করতে পারেন এবং যদি কোনো ভুল হয়, FastAPI স্বয়ংক্রিয়ভাবে ত্রুটি রেসপন্স প্রদান করে।
Request Validation এবং Error Handling উদাহরণ:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.post("/items/")
async def create_item(item: Item):
if item.price <= 0:
raise HTTPException(status_code=400, detail="Price must be greater than 0")
return {"item_name": item.name, "item_price": item.price}
এখানে:
- Item মডেল ব্যবহার করে ইনপুট ভ্যালিডেশন করা হয়েছে।
- HTTPException ব্যবহার করে যদি price ০ বা তার কম হয়, তবে ত্রুটি রিটার্ন করা হবে।
রিকোয়েস্ট উদাহরণ (ভুল ইনপুট):
{
"name": "Laptop",
"price": -500.00
}
রেসপন্স (ত্রুটি):
{
"detail": "Price must be greater than 0"
}
Step 5: Dependency Injection with Request and Response
FastAPI তে Dependency Injection ব্যবহার করে আপনি রিকোয়েস্ট এবং রেসপন্সের প্রক্রিয়া সহজভাবে পরিচালনা করতে পারেন। এটি ডেটা শেয়ারিং বা রিকোয়েস্টের নির্দিষ্ট ডিপেনডেন্সি পরিচালনার জন্য ব্যবহৃত হয়।
Dependency Injection উদাহরণ:
from fastapi import FastAPI, Depends
app = FastAPI()
def get_token():
return "secret_token"
@app.get("/items/")
async def get_item(token: str = Depends(get_token)):
return {"token": token}
এখানে, get_token একটি ডিপেনডেন্সি ফাংশন, যা টোকেন প্রদান করে এবং এটি Depends ডেকোরেটর ব্যবহার করে রিকোয়েস্টে ইনজেক্ট করা হয়।
রিকোয়েস্ট উদাহরণ:
GET /items/
রেসপন্স:
{
"token": "secret_token"
}
FastAPI তে Request এবং Response Lifecycle Handling অত্যন্ত সহজ এবং শক্তিশালী। Middleware, Request Validation, Response Manipulation, এবং Error Handling ব্যবস্থাপনা করে আপনি রিকোয়েস্ট এবং রেসপন্সের প্রক্রিয়া সহজে নিয়ন্ত্রণ করতে পারেন। Middleware ব্যবহার করে আপনি রিকোয়েস্ট এবং রেসপন্সের মধ্যে বিভিন্ন কাজ করতে পারেন যেমন লোগিং, হেডার ম্যানিপুলেশন এবং অ্যাপ্লিকেশন স্টেট ম্যানেজমেন্ট। FastAPI তে এই সব ফিচার ব্যবহার করে কোড আরও মডুলার, পুনঃব্যবহারযোগ্য এবং পরীক্ষণযোগ্য হয়ে ওঠে।
Read more