FastAPI তে Field Validation এবং Custom Validators ব্যবহার করে আপনি ইনপুট ডাটার স্বয়ংক্রিয় যাচাই এবং কাস্টম যাচাই ক্রিয়াকলাপ সম্পাদন করতে পারেন। এটি মূলত Pydantic মডেল ব্যবহার করে করা হয়, যা FastAPI এর ডাটা ভ্যালিডেশন পদ্ধতির কেন্দ্রবিন্দু।
এখানে, আমরা দেখব কিভাবে FastAPI তে Field Validation এবং Custom Validators ব্যবহার করা যায়, যাতে ইনপুট ডাটা যথাযথভাবে যাচাই করা যায়।
Field Validation
Pydantic মডেলে Field Validation ব্যবহার করে আপনি ডাটা টাইপের কনস্ট্রেইন্ট এবং অন্যান্য শর্ত যেমন min_length, max_length, gt, lt, regex ইত্যাদি নির্ধারণ করতে পারেন।
উদাহরণ: Basic Field Validation
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., min_length=3, max_length=50)
price: float = Field(..., gt=0) # Price must be greater than 0
description: str | None = Field(None, max_length=300)
এখানে:
name:min_length=3এবংmax_length=50দিয়ে বাধ্যতামূলকভাবে কমপক্ষে ৩ এবং সর্বোচ্চ ৫০টি অক্ষরের হতে হবে।price: greater than 0 (০ এর বেশি) হতে হবে।description: সর্বোচ্চ ৩০০টি অক্ষর হতে হবে।
রিকোয়েস্ট উদাহরণ:
{
"name": "Laptop",
"price": 1500.00,
"description": "A high-performance laptop"
}
রেসপন্স:
{
"name": "Laptop",
"price": 1500.00,
"description": "A high-performance laptop"
}
ভুল ইনপুট উদাহরণ (Price <= 0):
{
"name": "Laptop",
"price": -5.00,
"description": "A high-performance laptop"
}
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["body", "price"],
"msg": "ensure this value is greater than 0",
"type": "value_error.number.gt"
}
]
}
Custom Validators
Custom Validators ব্যবহার করে আপনি আরো জটিল এবং কাস্টম যাচাই সম্পাদন করতে পারেন। Pydantic এর @root_validator অথবা @validator ডেকোরেটর ব্যবহার করে কাস্টম লজিক যুক্ত করা যায়।
১. @validator ডেকোরেটর
@validator ডেকোরেটর দিয়ে আপনি কোনো নির্দিষ্ট ফিল্ডের কাস্টম যাচাই যুক্ত করতে পারেন। এটি একটি নির্দিষ্ট ফিল্ডের জন্য তৈরি করা হয়।
উদাহরণ: Custom Field Validator
from pydantic import BaseModel, validator
class Item(BaseModel):
name: str
price: float
@validator('price')
def price_must_be_positive(cls, v):
if v <= 0:
raise ValueError('Price must be greater than zero')
return v
এখানে, price ফিল্ডের জন্য একটি কাস্টম ভ্যালিডেটর যুক্ত করা হয়েছে, যা যাচাই করে যে দাম ০ এর বেশি হতে হবে।
রিকোয়েস্ট উদাহরণ (ভুল ইনপুট):
{
"name": "Laptop",
"price": -10.00
}
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["body", "price"],
"msg": "Price must be greater than zero",
"type": "value_error"
}
]
}
রিকোয়েস্ট উদাহরণ (সঠিক ইনপুট):
{
"name": "Laptop",
"price": 1500.00
}
রেসপন্স:
{
"name": "Laptop",
"price": 1500.00
}
২. @root_validator ডেকোরেটর
@root_validator ডেকোরেটর ব্যবহার করে আপনি একাধিক ফিল্ডের কাস্টম যাচাই করতে পারেন। এটি পুরো মডেল অবজেক্টের জন্য একযোগভাবে কাজ করে।
উদাহরণ: Root Validator
from pydantic import BaseModel, root_validator
class Item(BaseModel):
name: str
price: float
tax: float | None = None
@root_validator
def check_tax(cls, values):
price = values.get('price')
tax = values.get('tax', 0)
if tax and tax > price:
raise ValueError('Tax cannot be greater than price')
return values
এখানে, @root_validator ব্যবহার করা হয়েছে যাতে একসাথে price এবং tax ফিল্ডের জন্য যাচাই করা হয়। যদি tax এর মান price এর চেয়ে বেশি হয়, তাহলে ত্রুটি ফেরত দেওয়া হবে।
রিকোয়েস্ট উদাহরণ (ভুল ইনপুট):
{
"name": "Laptop",
"price": 1500.00,
"tax": 2000.00
}
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["body"],
"msg": "Tax cannot be greater than price",
"type": "value_error"
}
]
}
রিকোয়েস্ট উদাহরণ (সঠিক ইনপুট):
{
"name": "Laptop",
"price": 1500.00,
"tax": 100.00
}
রেসপন্স:
{
"name": "Laptop",
"price": 1500.00,
"tax": 100.00
}
Custom Validator for Email or Regex
FastAPI এবং Pydantic ব্যবহার করে আপনি কাস্টম ভ্যালিডেটর লিখে যেমন email validation, regex matching, অথবা অন্যান্য কোনো কাস্টম লজিক প্রয়োগ করতে পারেন।
উদাহরণ: Email Validation with Regex
from pydantic import BaseModel, EmailStr, validator
class User(BaseModel):
email: EmailStr
@validator('email')
def check_email_format(cls, v):
if "example.com" not in v:
raise ValueError("Email must be from example.com domain")
return v
এখানে, email ফিল্ডে একটি কাস্টম ভ্যালিডেটর যোগ করা হয়েছে, যা যাচাই করে যে ইমেইলটির ডোমেইন example.com হতে হবে।
রিকোয়েস্ট উদাহরণ (ভুল ইনপুট):
{
"email": "user@domain.com"
}
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["body", "email"],
"msg": "Email must be from example.com domain",
"type": "value_error"
}
]
}
রিকোয়েস্ট উদাহরণ (সঠিক ইনপুট):
{
"email": "user@example.com"
}
রেসপন্স:
{
"email": "user@example.com"
}
FastAPI এবং Pydantic এর Field Validation এবং Custom Validators এর সাহায্যে আপনি ইনপুট ডাটা যাচাই করতে পারেন এবং প্রয়োজনীয় কাস্টম লজিক যোগ করতে পারেন। @validator এবং @root_validator ডেকোরেটর ব্যবহার করে আপনি সহজেই কাস্টম ভ্যালিডেশন যুক্ত করতে পারেন, যা FastAPI অ্যাপ্লিকেশনকে আরও শক্তিশালী এবং নির্ভুল করে তোলে।
Read more