FastAPI একটি অত্যন্ত শক্তিশালী এবং উন্নত ফ্রেমওয়ার্ক যা বিল্ট-ইন Error Handling সরবরাহ করে। এতে ব্যবহারকারী যখন কোনো ভুল ইনপুট দেয় বা কোনো ত্রুটি ঘটে, তখন ত্রুটির বিস্তারিত বার্তা এবং HTTP স্ট্যাটাস কোড সহ দ্রুত রেসপন্স প্রদান করা হয়। FastAPI তে বিভিন্ন ধরনের ত্রুটি (Error) এবং এর জন্য HTTPException ব্যবহার করে কাস্টম ত্রুটি তৈরি করা যায়।
এখানে, আমরা দেখব কিভাবে FastAPI তে বিল্ট-ইন Error Handling ব্যবহৃত হয় এবং কিভাবে কাস্টম ত্রুটি তৈরি করা যায়।
Step 1: বিল্ট-ইন Error Handling
FastAPI স্বয়ংক্রিয়ভাবে অনেক ত্রুটি (Error) হ্যান্ডেল করে, যেমন:
- 404 (Not Found)
- 400 (Bad Request)
- 422 (Unprocessable Entity)
যখন রিকোয়েস্টের মধ্যে ভুল ডাটা বা ইনপুট থাকে, তখন FastAPI স্বয়ংক্রিয়ভাবে ত্রুটি তৈরি করে এবং ক্লায়েন্টকে সঠিক HTTP স্ট্যাটাস কোড সহ ত্রুটি বার্তা পাঠায়।
উদাহরণ: FastAPI তে বিল্ট-ইন ত্রুটি
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 1:
return {"item_id": item_id}
else:
raise HTTPException(status_code=404, detail="Item not found")
এখানে:
- যদি
item_id1 না হয়, তবে 404 Not Found ত্রুটি তৈরি হবে এবং Item not found বার্তা পাঠানো হবে।
রিকোয়েস্ট উদাহরণ:
GET /items/2
রেসপন্স (ত্রুটি):
{
"detail": "Item not found"
}
Step 2: কাস্টম Error Handling
FastAPI তে HTTPException ক্লাস ব্যবহার করে আপনি কাস্টম ত্রুটি তৈরি করতে পারেন। এটি status_code এবং detail প্যারামিটার সহ ত্রুটি ফেরত দেয়।
উদাহরণ: কাস্টম Error Handling
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 10:
raise HTTPException(status_code=400, detail="Bad Request: Invalid item ID")
elif item_id == 20:
raise HTTPException(status_code=404, detail="Item not found")
return {"item_id": item_id}
এখানে:
- যদি
item_id10 হয়, তবে 400 Bad Request ত্রুটি তৈরি হবে এবং Bad Request: Invalid item ID বার্তা পাঠানো হবে। - যদি
item_id20 হয়, তবে 404 Not Found ত্রুটি তৈরি হবে এবং Item not found বার্তা পাঠানো হবে।
রিকোয়েস্ট উদাহরণ:
GET /items/10
রেসপন্স (ত্রুটি):
{
"detail": "Bad Request: Invalid item ID"
}
Step 3: কাস্টম Error Handling এবং Custom Exception
আপনি চাইলে কাস্টম Exception ক্লাস তৈরি করে তাতে কাস্টম ত্রুটি ফেরত দিতে পারেন।
উদাহরণ: কাস্টম Exception ক্লাস তৈরি করা
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
class ItemNotFoundException(Exception):
def __init__(self, name: str):
self.name = name
@app.exception_handler(ItemNotFoundException)
async def item_not_found_exception_handler(request, exc: ItemNotFoundException):
return {"message": f"Item '{exc.name}' not found."}
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id != 1:
raise ItemNotFoundException(name=str(item_id))
return {"item_id": item_id}
এখানে:
ItemNotFoundExceptionএকটি কাস্টম Exception ক্লাস, যা যখন রিকোয়েস্টেরitem_id1 না হয়, তখন এই ত্রুটি তৈরি হবে।item_not_found_exception_handlerএকটি কাস্টম exception handler, যা ত্রুটির মেসেজ কাস্টমাইজ করে।
রিকোয়েস্ট উদাহরণ:
GET /items/2
রেসপন্স (ত্রুটি):
{
"message": "Item '2' not found."
}
Step 4: Validation Error Handling
FastAPI-তে Pydantic Models ব্যবহার করার সময় ইনপুট ভ্যালিডেশন ত্রুটি হতে পারে। FastAPI স্বয়ংক্রিয়ভাবে 422 Unprocessable Entity ত্রুটি ফেলে যদি ইনপুট ডাটা Pydantic Model এর সাথে মেলে না।
উদাহরণ: 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 cannot be negative")
return item
এখানে:
Itemমডেলটিnameএবংpriceএর জন্য ভ্যালিডেশন করে।- যদি
priceএর মান নেগেটিভ হয়, তবে 400 Bad Request ত্রুটি তৈরি হবে।
রিকোয়েস্ট উদাহরণ:
POST /items/
{
"name": "Laptop",
"price": -1500
}
রেসপন্স (ত্রুটি):
{
"detail": "Price cannot be negative"
}
Step 5: HTTP Status Codes Customization
FastAPI-তে আপনি কাস্টম HTTP Status Code সহ ত্রুটি ফেরত দিতে পারেন, যেমন 401 Unauthorized, 403 Forbidden, 500 Internal Server Error ইত্যাদি।
উদাহরণ: কাস্টম HTTP Status Code ব্যবহার
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/protected/")
async def protected_resource():
raise HTTPException(status_code=401, detail="Unauthorized access")
এখানে 401 Unauthorized স্ট্যাটাস কোড ব্যবহার করা হয়েছে, যা শুধুমাত্র অনুমোদিত ব্যবহারকারীকে রিসোর্স অ্যাক্সেস করতে দেবে।
রিকোয়েস্ট উদাহরণ:
GET /protected/
রেসপন্স (ত্রুটি):
{
"detail": "Unauthorized access"
}
FastAPI তে Error Handling সহজ, কার্যকরী এবং কাস্টমাইজযোগ্য। এটি HTTPException ব্যবহার করে কাস্টম ত্রুটি তৈরি করতে সহায়ক এবং আপনি status_code এবং detail প্যারামিটার ব্যবহার করে ত্রুটি বার্তা কাস্টমাইজ করতে পারেন। FastAPI তে ইনপুট ভ্যালিডেশন ত্রুটিগুলির জন্য স্বয়ংক্রিয়ভাবে 422 Unprocessable Entity ত্রুটি দেখানো হয় এবং আপনি চাইলে কাস্টম Exception তৈরি করে আরও নির্দিষ্ট ত্রুটি বার্তা এবং কোড কনফিগার করতে পারেন।
Read more