FastAPI একটি অত্যন্ত শক্তিশালী এবং কার্যক্ষম Python framework, যা Data Validation এবং Pydantic ব্যবহার করে ইনপুট ডাটার টাইপ যাচাই, ক্লিনিং এবং ভ্যালিডেশন সরাসরি অ্যাপ্লিকেশন লেভেলে সম্পাদন করতে সাহায্য করে। FastAPI এর স্বয়ংক্রিয় Data Validation একটি বড় সুবিধা, যেটি আপনার API এর নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করে।
Pydantic হল একটি লাইব্রেরি যা ডাটা ভ্যালিডেশন এবং টাইপ সেফটি নিশ্চিত করতে FastAPI-এর সাথে যুক্ত হয়। এটি বিশেষভাবে মডেল ডেটা তৈরি এবং যাচাইয়ের জন্য ব্যবহৃত হয়।
Pydantic এবং Data Validation এর মূল বৈশিষ্ট্য
- টাইপ সেফটি: Pydantic ব্যবহার করে FastAPI স্বয়ংক্রিয়ভাবে ইনপুট ডাটার টাইপ যাচাই করে। যদি টাইপ মেলে না, এটি ত্রুটি প্রদান করে।
- ডাটা ক্লিনিং: ইনপুট ডাটা সরাসরি ক্লিন এবং পরিস্কার করতে Pydantic অটোমেটিক ভাবে কাজ করে।
- ভ্যালিডেশন: Pydantic Models ডেটার বিভিন্ন ভ্যালিডেশন ফিচার (যেমন, মিন, ম্যাক্স, প্যাটার্ন, রেঞ্জ) সংজ্ঞায়িত করতে দেয়।
- ডিফল্ট মান: আপনি মডেল ব্যবহার করে ডিফল্ট মান নির্ধারণ করতে পারেন, যা ইনপুট না আসলে ব্যবহার করা হবে।
Pydantic Model এবং Data Validation
FastAPI তে, Pydantic Model ব্যবহার করে Request Body, Query Parameters বা Path Parameters এর জন্য ভ্যালিডেশন করা যায়।
Step 1: Pydantic Model তৈরি
Pydantic মডেল ব্যবহার করে আমরা ইনপুট ডাটার টাইপ এবং ভ্যালিডেশন নির্ধারণ করতে পারি।
উদাহরণ: Pydantic Model
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., min_length=3, example="Laptop")
description: str | None = Field(None, max_length=300, example="A high-performance laptop")
price: float = Field(..., gt=0, example=1500.00)
tax: float | None = Field(None, example=120.00)
এখানে:
name: একটি স্ট্রিং ফিল্ড যা ৩টির বেশি অক্ষর হতে হবে।description: ঐচ্ছিক (Optional) স্ট্রিং ফিল্ড এবং সর্বাধিক ৩০০ অক্ষর হতে পারবে।price: একটি ফ্লোট ফিল্ড, যার মান শূন্যের বেশি (গ্রেটার-থান ০) হতে হবে।tax: ঐচ্ছিক ফ্লোট ফিল্ড।
Step 2: FastAPI রাউট তৈরি এবং Request Body ব্যবহার
FastAPI তে Pydantic Model ব্যবহার করে POST রিকোয়েস্টের Request Body তৈরি করা হয়।
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
name: str = Field(..., min_length=3, example="Laptop")
description: str | None = Field(None, max_length=300, example="A high-performance laptop")
price: float = Field(..., gt=0, example=1500.00)
tax: float | None = Field(None, example=120.00)
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price, "item_tax": item.tax}
এখানে, Item মডেলটি Request Body হিসেবে POST রিকোয়েস্টে গ্রহণ করা হয়েছে। ইনপুট ডাটার মান Pydantic Model দিয়ে যাচাই করা হবে।
Step 3: Validation (ভ্যালিডেশন)
FastAPI তে Pydantic Model ব্যবহার করে Data Validation স্বয়ংক্রিয়ভাবে হয়। যেমন:
name: অন্তত ৩টি অক্ষর হতে হবে।price: শূন্যের বেশি মান হতে হবে।description: সর্বাধিক ৩০০ অক্ষর।tax: ঐচ্ছিক (Optional)।
উদাহরণ: ভুল ইনপুট
{
"name": "Lap",
"description": "Laptop",
"price": -1500.00,
"tax": 120.00
}
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["body", "price"],
"msg": "ensure this value is greater than 0",
"type": "value_error.number.gt"
}
]
}
এখানে, price-এর মান ০ এর কম হওয়ার কারণে একটি ত্রুটি (Error) দেখানো হয়েছে।
Step 4: Default Values এবং Optional Fields
Pydantic Model-এ optional fields এবং default values নির্ধারণ করা যায়।
উদাহরণ: Optional এবং Default Values সহ Pydantic Model
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str
description: str | None = Field("No description", max_length=300) # Default value
price: float
tax: float | None = None # Optional field
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price, "item_tax": item.tax, "description": item.description}
এখানে:
descriptionএকটি ঐচ্ছিক (Optional) ফিল্ড, যার ডিফল্ট মান"No description"।
রিকোয়েস্ট উদাহরণ:
{
"name": "Laptop",
"price": 1500.00
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00,
"item_tax": null,
"description": "No description"
}
এখানে, description ঐচ্ছিক হওয়ায়, এটি না দেওয়া হলে ডিফল্ট মান "No description" ব্যবহার করা হয়েছে।
Step 5: Custom Validation with Pydantic
Pydantic মডেল ব্যবহার করে আপনি কাস্টম ভ্যালিডেশনও করতে পারেন। যেমন, আপনি @root_validator ব্যবহার করে মডেল ভ্যালিডেশন করতে পারেন।
উদাহরণ: কাস্টম ভ্যালিডেশন
from pydantic import BaseModel, root_validator
class Item(BaseModel):
name: str
price: float
tax: float
@root_validator
def check_price_and_tax(cls, values):
price = values.get("price")
tax = values.get("tax")
if price and tax and price < tax:
raise ValueError("Price cannot be less than tax")
return values
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price, "item_tax": item.tax}
এখানে, check_price_and_tax একটি কাস্টম ভ্যালিডেটর, যা চেক করে যে price কখনও tax এর চেয়ে কম হতে পারে না।
রিকোয়েস্ট উদাহরণ (ভুল মান):
{
"name": "Laptop",
"price": 1000.00,
"tax": 1500.00
}
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["body"],
"msg": "Price cannot be less than tax",
"type": "value_error"
}
]
}
FastAPI তে Pydantic Model ব্যবহার করে Data Validation অত্যন্ত শক্তিশালী এবং সহজ। আপনি ইনপুট ডাটা যাচাই, টাইপ সেফটি, কাস্টম ভ্যালিডেশন, ডিফল্ট মান এবং ঐচ্ছিক ফিল্ডগুলি সহ একটি পরিষ্কার এবং সঠিক API তৈরি করতে পারেন। Pydantic মডেল দ্বারা এই সমস্ত ভ্যালিডেশন এবং ডাটা যাচাই সহজেই করা যায়, যা FastAPI-কে আরও কার্যক্ষম এবং নিরাপদ করে তোলে।
Pydantic হলো একটি ডাটা ভ্যালিডেশন এবং ডাটা মডেলিং লাইব্রেরি, যা Python-এর জন্য তৈরি। এটি FastAPI-এর জন্য একটি গুরুত্বপূর্ণ অংশ, কারণ এটি FastAPI অ্যাপ্লিকেশনগুলির জন্য ডাটা যাচাই, টাইপ এনোটেশন এবং ডাটা ট্রান্সফার সহজ করে তোলে। FastAPI এবং Pydantic একসাথে কাজ করে ইনপুট ডাটার ভ্যালিডেশন, সঠিক টাইপ যাচাই এবং ডাটা মডেলিং অত্যন্ত দ্রুত এবং কার্যকরভাবে সম্পাদন করতে।
Pydantic কী?
Pydantic একটি Python লাইব্রেরি যা ডাটা ভ্যালিডেশন এবং ডাটা পার্সিং এর জন্য ব্যবহৃত হয়। Pydantic, Python-এর টাইপ অ্যানোটেশন (Type Annotation) ব্যবহার করে ডাটা ভ্যালিডেশন এবং টাইপ যাচাই সম্পাদন করে, যা কোডের স্বচ্ছতা এবং নিরাপত্তা বাড়ায়।
Pydantic ব্যবহারের মাধ্যমে আপনি ডাটা মডেল তৈরি করতে পারেন এবং এই মডেলগুলির মাধ্যমে ডাটা ভ্যালিডেট এবং সঠিক টাইপে পার্স করা যায়। এটি Python 3.6+ সংস্করণের সাথে কাজ করে এবং Python-এর dataclass-এর মতো সাধারণ ডাটা ক্লাসের থেকে অনেক বেশি শক্তিশালী।
Pydantic এবং FastAPI
FastAPI Pydantic ব্যবহার করে ইনপুট ডাটা যাচাই ও টাইপ নিশ্চিত করে। FastAPI-তে Request Body, Path Parameters, Query Parameters এবং অন্যান্য ইনপুট ডাটার জন্য Pydantic মডেল ব্যবহার করা হয়। এই মডেলগুলো BaseModel ক্লাস থেকে ইনহেরিট করে তৈরি করা হয়।
Pydantic এবং FastAPI-এর সম্পর্ক:
- ডাটা ভ্যালিডেশন: FastAPI-এর মাধ্যমে API রিকোয়েস্টের ইনপুট ডাটার ভ্যালিডেশন স্বয়ংক্রিয়ভাবে সম্পাদিত হয়।
- টাইপ সেফটি: Pydantic মডেলগুলি টাইপ সেফটি নিশ্চিত করে, অর্থাৎ, ইনপুট ডাটা সঠিক টাইপে রয়েছে কিনা তা যাচাই করা হয়।
- স্পিড এবং পারফরম্যান্স: FastAPI এবং Pydantic একসাথে ব্যবহার করা হলে অ্যাপ্লিকেশনটি দ্রুত এবং পারফরম্যান্ট হয়।
Pydantic কেন প্রয়োজন?
Pydantic-এর ব্যবহার FastAPI-এর জন্য বিভিন্ন কারণে গুরুত্বপূর্ণ। নিচে Pydantic এর প্রয়োজনীয়তার কয়েকটি কারণ আলোচনা করা হলো:
১. ডাটা ভ্যালিডেশন সহজ করা
Pydantic ব্যবহার করে ইনপুট ডাটা ভ্যালিডেট করা সহজ হয়ে যায়। এটি বিভিন্ন ধরনের ডাটা (যেমন: স্ট্রিং, ইন্টিজার, ফ্লোট, বুলিয়ান) যাচাই করে এবং যেকোনো ভুল টাইপের ইনপুটকে ধরা সম্ভব করে।
উদাহরণ:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
এখানে, name অবশ্যই একটি স্ট্রিং এবং price অবশ্যই একটি ফ্লোট হতে হবে। যদি ইউজার ভুল ইনপুট দেয়, যেমন:
{
"name": "Laptop",
"price": "invalid_price"
}
তাহলে FastAPI স্বয়ংক্রিয়ভাবে ত্রুটি দেখাবে।
২. টাইপ সেফটি
Pydantic টাইপ সেফটি নিশ্চিত করে, অর্থাৎ ইউজার যখন কোনও ইনপুট পাঠাবে, তখন সেই ইনপুট সঠিক টাইপে থাকতে হবে। এটি ডেভেলপারদের জন্য কোডের নিরাপত্তা এবং কোড সঠিকতার প্রমাণ।
class Item(BaseModel):
name: str
price: float
এখানে, FastAPI নিশ্চিত করবে যে price একটি ফ্লোট টাইপ এবং name একটি স্ট্রিং টাইপ হতে হবে। যদি ভুল টাইপের ডাটা পাঠানো হয়, তাহলে FastAPI 400 বাড রেসপন্স ফেরত দেবে।
৩. ডাটা পার্সিং এবং কনভার্সন
Pydantic ইনপুট ডাটাকে স্বয়ংক্রিয়ভাবে কনভার্ট করে সঠিক টাইপে রূপান্তরিত করে। যেমন, যদি আপনি JSON এ স্ট্রিং আকারে একটি ফ্লোট মান পাঠান, তবে Pydantic সেটিকে ফ্লোট টাইপে কনভার্ট করে নেয়।
class Item(BaseModel):
price: float
@app.post("/items/")
def create_item(item: Item):
return {"price": item.price}
৪. ডিফল্ট মান এবং ঐচ্ছিক ফিল্ড
Pydantic মডেলগুলিতে আপনি ডিফল্ট মান এবং ঐচ্ছিক ফিল্ড নির্ধারণ করতে পারেন, যা ডেটা ইনপুট সহজ করে তোলে।
from typing import Optional
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None # Optional field
price: float
এখানে, description ফিল্ডটি ঐচ্ছিক এবং ডিফল্ট মান None থাকবে। price বাধ্যতামূলক (required) ফিল্ড।
৫. ডাটা ট্রান্সফরমেশন
Pydantic ব্যবহার করে ইনপুট ডাটা সহজেই ট্রান্সফর্ম (যেমন: স্ট্রিং ক্যাপিটালাইজ করা, ফর্ম্যাট পরিবর্তন করা) করা যায়।
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., min_length=3, max_length=100)
price: float
class Config:
anystr_strip_whitespace = True
এখানে, name ফিল্ডের স্ট্রিংয়ে অতিরিক্ত স্পেস থাকলে তা স্বয়ংক্রিয়ভাবে অপসারণ করা হবে।
৬. স্বয়ংক্রিয় ডকুমেন্টেশন
Pydantic মডেলগুলো FastAPI-এর Swagger UI এবং ReDoc-এ স্বয়ংক্রিয়ভাবে ডকুমেন্টেশন তৈরি করে। যেকোনো API এন্ডপয়েন্টে মডেল যুক্ত করলে, তা ইন্টারেক্টিভভাবে ডকুমেন্টেশন হিসেবে প্রদর্শিত হবে।
@app.post("/items/", response_model=Item)
def create_item(item: Item):
return item
এখানে, FastAPI এই মডেলটি Swagger UI বা ReDoc-এ স্বয়ংক্রিয়ভাবে প্রদর্শন করবে।
Pydantic FastAPI-র সাথে একত্রে ব্যবহার করে ডাটা ভ্যালিডেশন, টাইপ সেফটি, ডাটা ট্রান্সফরমেশন এবং স্বয়ংক্রিয় ডকুমেন্টেশন নিশ্চিত করার ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি FastAPI কে অত্যন্ত শক্তিশালী এবং সহজ ব্যবহারযোগ্য করে তোলে, কারণ Pydantic স্বয়ংক্রিয়ভাবে ডাটার ভ্যালিডেশন এবং পার্সিং সম্পাদন করে, ফলে ডেভেলপারদের জন্য কোড লেখা এবং ত্রুটি শনাক্ত করা সহজ হয়।
FastAPI তে Pydantic Model ব্যবহার করে ডাটা ভ্যালিডেশন এবং টাইপ চেকিং খুবই সহজ এবং শক্তিশালী। Pydantic একটি Python লাইব্রেরি যা ডাটা যাচাই (validation) এবং টাইপ এনোটেশনকে সহজ করে তোলে। FastAPI Pydantic মডেল ব্যবহার করে ইনপুট ডাটার টাইপ যাচাই এবং ভ্যালিডেশন কার্যকরভাবে সম্পন্ন করে।
এখানে আমরা দেখব কিভাবে Pydantic Model তৈরি এবং ভ্যালিডেশন করতে হয়, এবং কিভাবে FastAPI-তে এই মডেল ব্যবহার করা যায়।
Step 1: Pydantic Model তৈরি করা
Pydantic মডেল তৈরি করতে BaseModel ক্লাসকে ইনহেরিট করতে হয়। এর মধ্যে আপনি ডাটা টাইপ এবং বিভিন্ন ভ্যালিডেশন রুলস নির্ধারণ করতে পারেন।
Pydantic Model উদাহরণ
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
এখানে:
name: একটি স্ট্রিং (string) টাইপ ফিল্ড, যা বাধ্যতামূলক।description: একটি ঐচ্ছিক স্ট্রিং (string) টাইপ ফিল্ড।price: একটি ফ্লোট (float) টাইপ ফিল্ড, যা বাধ্যতামূলক।tax: একটি ঐচ্ছিক ফ্লোট (float) টাইপ ফিল্ড।
Step 2: FastAPI-তে Pydantic Model ব্যবহার করা
এখন FastAPI-তে Pydantic মডেলটি ব্যবহার করে একটি API এন্ডপয়েন্ট তৈরি করা হবে, যা একটি POST রিকোয়েস্ট গ্রহণ করবে।
উদাহরণ: Pydantic Model ব্যবহার করে FastAPI এন্ডপয়েন্ট
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# Pydantic Model
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price, "item_tax": item.tax}
এখানে, /items/ এন্ডপয়েন্ট একটি POST রিকোয়েস্ট গ্রহণ করবে এবং Item মডেলটি Request Body হিসেবে গ্রহণ করবে।
রিকোয়েস্ট উদাহরণ (JSON Body):
POST /items/
Body:
{
"name": "Laptop",
"description": "A high-performance laptop",
"price": 1500.00,
"tax": 120.00
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00,
"item_tax": 120.00
}
এখানে, Request Body JSON আকারে পাঠানো হয়েছে এবং FastAPI এই ডাটা Item মডেল দিয়ে স্বয়ংক্রিয়ভাবে ভ্যালিডেট করেছে।
Step 3: Pydantic Model-এ Validation (ভ্যালিডেশন)
Pydantic মডেল ব্যবহার করে FastAPI-তে ইনপুট ডাটা ভ্যালিডেশন করা যায়। আপনি Field কনস্ট্রেইন্ট (constraints) ব্যবহার করে ইনপুট ডাটার সীমাবদ্ধতা নির্ধারণ করতে পারেন, যেমন min_length, max_length, gt, lt, regex ইত্যাদি।
উদাহরণ: Validation কনস্ট্রেইন্ট সহ Pydantic Model
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., min_length=3) # নামের কমপক্ষে ৩টি অক্ষর থাকতে হবে
description: str | None = Field(None, max_length=300) # বর্ণনা সর্বোচ্চ ৩০০টি অক্ষর
price: float = Field(..., gt=0) # দাম শূন্যের বেশি হতে হবে
tax: float | None = None
এখানে:
name: কমপক্ষে ৩টি অক্ষর থাকতে হবে।description: সর্বাধিক ৩০০টি অক্ষর থাকতে হবে।price: ০ এর বেশি হওয়া উচিত।
রিকোয়েস্ট উদাহরণ:
{
"name": "Laptop",
"description": "A high-end laptop",
"price": 1500.00
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00
}
ভুল ইনপুট উদাহরণ (যেমন: price <= 0):
{
"name": "Laptop",
"description": "A high-end laptop",
"price": -10.00
}
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["body", "price"],
"msg": "ensure this value is greater than 0",
"type": "value_error.number.gt"
}
]
}
এখানে, price ফিল্ডে -10.00 মানটি ভুল কারণ এটি ০ এর কম, এবং FastAPI সেই অনুযায়ী ত্রুটি দেখাবে।
Step 4: Default Values এবং Optional Fields
Pydantic মডেলে আপনি Optional Fields এবং Default Values নির্ধারণ করতে পারেন।
উদাহরণ: Optional Fields এবং Default Values
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = "No description provided" # Default value
price: float
tax: float | None = 0.0 # Default value
এখানে:
description: ঐচ্ছিক ফিল্ড এবং এর ডিফল্ট মান"No description provided"।tax: ঐচ্ছিক ফিল্ড এবং এর ডিফল্ট মান0.0।
রিকোয়েস্ট উদাহরণ:
{
"name": "Laptop",
"price": 1500.00
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00,
"item_tax": 0.0,
"description": "No description provided"
}
এখানে, description ফিল্ডের ডিফল্ট মান "No description provided" ব্যবহার করা হয়েছে কারণ এটি পাঠানো হয়নি।
Step 5: Nested Models (নেস্টেড মডেল)
FastAPI তে Pydantic মডেল ব্যবহার করে আপনি nested models তৈরি করতে পারেন, যা জটিল ডাটা স্ট্রাকচারকে সমর্থন করে।
উদাহরণ: Nested Models
from pydantic import BaseModel
from typing import List
class Manufacturer(BaseModel):
name: str
country: str
class Item(BaseModel):
name: str
price: float
manufacturer: Manufacturer # Nested Model
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price, "manufacturer": item.manufacturer}
এখানে, Item মডেলের মধ্যে Manufacturer মডেলকে nested হিসেবে অন্তর্ভুক্ত করা হয়েছে।
রিকোয়েস্ট উদাহরণ:
{
"name": "Laptop",
"price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
এখানে, manufacturer একটি nested model হিসেবে Item মডেলে অন্তর্ভুক্ত করা হয়েছে।
FastAPI-তে Pydantic Model ব্যবহার করে Request Body তৈরি এবং ভ্যালিডেশন করা খুবই সহজ এবং কার্যকর। আপনি Pydantic মডেলের মাধ্যমে ইনপুট ডাটা টাইপ, ভ্যালিডেশন কনস্ট্রেইন্ট এবং ডিফল্ট মান খুব সহজে নির্ধারণ করতে পারেন। এছাড়া, আপনি নেস্টেড মডেল ব্যবহার করে জটিল ডাটা স্ট্রাকচারও তৈরি করতে পারেন, যা আপনার API-এর কার্যক্ষমতা এবং নিরাপত্তা বাড়ায়।
FastAPI-তে Nested Models এবং Complex Data Structures ব্যবস্থাপনা খুবই সহজ এবং শক্তিশালী। FastAPI Pydantic মডেল ব্যবহার করে বিভিন্ন ধরনের নেস্টেড ডাটা স্ট্রাকচার সমর্থন করে, যা জটিল API অ্যাপ্লিকেশনগুলোর জন্য অত্যন্ত কার্যকর।
এখানে, আমরা দেখব কিভাবে FastAPI তে Nested Models তৈরি করা যায় এবং Complex Data Structures ব্যবস্থাপনা করা যায়।
Nested Models তৈরি করা
Nested Models হল এমন মডেল যেখানে একটি মডেল অন্য মডেলের ভেতরে ব্যবহৃত হয়। FastAPI তে আপনি সহজেই একটি মডেলকে আরেকটি মডেলের মধ্যে রাখতে পারেন।
উদাহরণ: Nested Models
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# Nested Model: Manufacturer
class Manufacturer(BaseModel):
name: str
country: str
# Main Model: Item
class Item(BaseModel):
name: str
price: float
manufacturer: Manufacturer
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price, "manufacturer": item.manufacturer}
এখানে, Item মডেলের মধ্যে Manufacturer মডেলটি nested হিসেবে ব্যবহার করা হয়েছে।
রিকোয়েস্ট উদাহরণ (Nested JSON):
POST /items/
{
"name": "Laptop",
"price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
এখানে, manufacturer একটি nested model হিসেবে Item মডেলে উপস্থিত রয়েছে।
Complex Data Structures: List of Nested Models
আপনি FastAPI তে List of Nested Models ব্যবহার করতে পারেন যেখানে একটি মডেল একাধিক ইনস্ট্যান্স ধারণ করবে।
উদাহরণ: List of Nested Models
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
app = FastAPI()
# Nested Model: Manufacturer
class Manufacturer(BaseModel):
name: str
country: str
# Main Model: Item
class Item(BaseModel):
name: str
price: float
manufacturer: Manufacturer
# Complex Data Structure: List of Items
@app.post("/items/")
def create_items(items: List[Item]):
return {"items": items}
এখানে, List[Item] ব্যবহার করে একাধিক Item মডেল নেওয়া হয়েছে, যার মধ্যে প্রতিটি Item মডেল একটি Manufacturer মডেল ধারণ করে।
রিকোয়েস্ট উদাহরণ (List of Nested Models):
POST /items/
[
{
"name": "Laptop",
"price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
},
{
"name": "Smartphone",
"price": 800.00,
"manufacturer": {
"name": "MobileTech",
"country": "India"
}
}
]
রেসপন্স:
{
"items": [
{
"name": "Laptop",
"price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
},
{
"name": "Smartphone",
"price": 800.00,
"manufacturer": {
"name": "MobileTech",
"country": "India"
}
}
]
}
এখানে, items একটি List যা একাধিক Item ধারণ করে, এবং প্রতিটি Item এর মধ্যে Manufacturer মডেলটি nested অবস্থায় রয়েছে।
Complex Data Structures: Dictionary with Nested Models
FastAPI তে Dictionary বা Map ধরনের ডাটা স্ট্রাকচারও ব্যবহার করা যেতে পারে। এখানে আমরা একটি ডিকশনারি ব্যবহার করব যা key-value পেয়ার ধারণ করবে এবং value হবে একটি Nested Model।
উদাহরণ: Dictionary with Nested Models
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Dict
app = FastAPI()
# Nested Model: Manufacturer
class Manufacturer(BaseModel):
name: str
country: str
# Main Model: Item
class Item(BaseModel):
name: str
price: float
manufacturer: Manufacturer
# Complex Data Structure: Dictionary of Items
@app.post("/items/")
def create_items(items: Dict[str, Item]):
return {"items": items}
এখানে, items একটি Dictionary যেটি key (str) এবং value (Item) ধারণ করে।
রিকোয়েস্ট উদাহরণ (Dictionary of Nested Models):
POST /items/
{
"item1": {
"name": "Laptop",
"price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
},
"item2": {
"name": "Smartphone",
"price": 800.00,
"manufacturer": {
"name": "MobileTech",
"country": "India"
}
}
}
রেসপন্স:
{
"items": {
"item1": {
"name": "Laptop",
"price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
},
"item2": {
"name": "Smartphone",
"price": 800.00,
"manufacturer": {
"name": "MobileTech",
"country": "India"
}
}
}
}
এখানে, items একটি Dictionary যেখানে key হিসেবে item1, item2 ইত্যাদি ব্যবহার করা হয়েছে এবং প্রতিটি key-এর value একটি Item মডেল।
Complex Data Structures with Validation
FastAPI এবং Pydantic ব্যবহার করে আপনি Complex Data Structures এর জন্য validation করতে পারেন। যেমন, আপনি একটি মডেলে minimum length বা range সহ validation যোগ করতে পারেন।
উদাহরণ: Complex Data Structure with Validation
from fastapi import FastAPI
from pydantic import BaseModel, Field
from typing import List
app = FastAPI()
# Nested Model: Manufacturer
class Manufacturer(BaseModel):
name: str
country: str
# Main Model: Item with Validation
class Item(BaseModel):
name: str = Field(..., min_length=3) # name must have at least 3 characters
price: float = Field(..., gt=0) # price must be greater than 0
manufacturer: Manufacturer
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price, "manufacturer": item.manufacturer}
এখানে, name ফিল্ডে min_length=3 এবং price ফিল্ডে gt=0 (greater than 0) validation করা হয়েছে।
রিকোয়েস্ট উদাহরণ:
{
"name": "Laptop",
"price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
FastAPI তে Nested Models এবং Complex Data Structures ব্যবস্থাপনা খুবই সহজ এবং শক্তিশালী। আপনি সহজেই একাধিক মডেলকে একত্রে ব্যবহার করে জটিল ডাটা স্ট্রাকচার তৈরি করতে পারেন, যেমন Lists, Dictionaries বা Nested Models। এছাড়া, Pydantic এর মাধ্যমে ডাটা ভ্যালিডেশন করে, আপনি ডাটা integrity এবং কোডের নির্ভুলতা নিশ্চিত করতে পারেন। FastAPI এর এই বৈশিষ্ট্যগুলি আপনাকে স্কেলেবল এবং রক্ষণাবেক্ষণযোগ্য API তৈরি করতে সহায়তা করবে।
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