FastAPI তে Request Body এবং Form Handling ব্যবস্থাপনা খুবই সহজ এবং শক্তিশালী। এর মাধ্যমে আপনি JSON, XML, বা HTML form ডেটা গ্রহণ করতে পারেন এবং সেগুলোর সাথে ডাটাবেস বা অন্যান্য API-এর সাথে ইন্টারঅ্যাক্ট করতে পারেন।
Request Body Handling (JSON Body)
FastAPI তে Request Body সাধারণত JSON আকারে পাঠানো হয় এবং এটি BaseModel এর মাধ্যমে ভ্যালিডেট এবং ডেসিরিয়ালাইজ করা হয়।
Request Body-তে JSON ডাটা গ্রহণ
JSON ডেটা গ্রহণ করার জন্য, আমরা Pydantic এর BaseModel ব্যবহার করি, যা ডেটার ভ্যালিডেশন এবং টাইপ নিশ্চিত করে।
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# Request Body 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}
রিকোয়েস্ট উদাহরণ (JSON Body):
POST /items/
{
"name": "Laptop",
"description": "A high-performance laptop",
"price": 1500.00,
"tax": 120.00
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00
}
এখানে, item একটি Request Body হিসেবে পাঠানো হয়েছে এবং FastAPI এটি Item মডেল দিয়ে স্বয়ংক্রিয়ভাবে ভ্যালিডেট করে।
Form Data Handling
FastAPI তে Form Data সংগ্রহ করতে, আমরা Form এবং File ব্যবহার করতে পারি। Form Data সাধারণত HTML ফর্মের মাধ্যমে পাঠানো হয়।
Form Data Handling উদাহরণ:
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/submit-form/")
def submit_form(name: str = Form(...), age: int = Form(...)):
return {"name": name, "age": age}
এখানে, name এবং age ফর্ম প্যারামিটার হিসেবে গ্রহণ করা হয়েছে। Form(...) ডেকোরেটরটি ব্যবহার করে FastAPI ফর্মের ডাটা হ্যান্ডল করে।
রিকোয়েস্ট উদাহরণ (Form Data):
POST /submit-form/
ফর্ম ডাটা:
<form action="/submit-form/" method="post">
<input type="text" name="name" value="John Doe">
<input type="number" name="age" value="30">
<input type="submit">
</form>
রেসপন্স:
{
"name": "John Doe",
"age": 30
}
এখানে, ফর্ম ডাটাকে name এবং age নামে দুইটি প্যারামিটার হিসেবে গ্রহণ করা হয়েছে।
File Upload Handling
FastAPI তে ফাইল আপলোড করার জন্য File এবং UploadFile ক্লাস ব্যবহার করা হয়। এর মাধ্যমে আপনি ব্যবহারকারীর থেকে ফাইল গ্রহণ করতে পারেন এবং ফাইল প্রসেস করতে পারেন।
ফাইল আপলোড উদাহরণ:
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
return {"filename": file.filename, "content_type": file.content_type}
এখানে, file হলো UploadFile টিপে ফাইল আপলোডের জন্য একটি প্যারামিটার। UploadFile ব্যবহার করার মাধ্যমে ফাইলের মেটাডেটা যেমন ফাইলের নাম এবং কনটেন্ট টাইপ অ্যাক্সেস করা যায়।
রিকোয়েস্ট উদাহরণ (File Upload):
POST /uploadfile/
ফাইল আপলোড করার জন্য একটি HTML ফর্ম:
<form action="/uploadfile/" enctype="multipart/form-data" method="post">
<input type="file" name="file">
<input type="submit">
</form>
রেসপন্স:
{
"filename": "example.txt",
"content_type": "text/plain"
}
এখানে, ফাইলের নাম এবং কনটেন্ট টাইপ রেসপন্সে ফিরিয়ে দেওয়া হয়েছে।
Combining Request Body and Form Data
FastAPI-তে আপনি Request Body এবং Form Data একত্রে ব্যবহার করতে পারেন, যদিও এই দুটি একসাথে একই রিকোয়েস্টে পাঠানো যাবে না, তবে আপনি আলাদা করে দুইটি ডাটা টাইপ গ্রহণ করতে পারেন।
উদাহরণ: JSON এবং Form Data একসাথে গ্রহণ:
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
# Request Body Model
class Item(BaseModel):
name: str
price: float
@app.post("/submit/")
async def submit_item(item: Item, description: str = Form(...)):
return {"item_name": item.name, "price": item.price, "description": description}
রিকোয়েস্ট উদাহরণ:
<form action="/submit/" method="post">
<input type="text" name="name" value="Laptop">
<input type="number" name="price" value="1500">
<textarea name="description">A high-performance laptop</textarea>
<input type="submit">
</form>
রেসপন্স:
{
"item_name": "Laptop",
"price": 1500,
"description": "A high-performance laptop"
}
এখানে, name এবং price JSON Body হিসেবে পাঠানো হয়েছে, এবং description ফর্ম ডাটা হিসেবে পাঠানো হয়েছে।
Request Body Validation
FastAPI তে Request Body (যেমন JSON) স্বয়ংক্রিয়ভাবে ভ্যালিডেট করা হয়। আপনি Pydantic মডেল ব্যবহার করে ইনপুট ডাটার টাইপ এবং সিমান্ত নির্ধারণ করতে পারেন। যেমন, আপনি min_length, max_length, gt, lt, regex ইত্যাদি ভ্যালিডেশন কন্ডিশন দিতে পারেন।
উদাহরণ: Request Body Validation
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., min_length=3)
price: float = Field(..., gt=0)
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
এখানে, name ফিল্ডের কমপক্ষে ৩টি অক্ষর থাকতে হবে এবং price ফিল্ডের ০ এর বেশি হওয়া উচিত।
রিকোয়েস্ট উদাহরণ:
{
"name": "Laptop",
"price": 1500
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500
}
FastAPI তে Request Body, Form Data, এবং File Handling খুবই সহজ এবং শক্তিশালী। আপনি সহজে JSON, Form, এবং ফাইল ডাটা গ্রহণ এবং প্রসেস করতে পারেন, এবং FastAPI স্বয়ংক্রিয়ভাবে ডাটা ভ্যালিডেশন ও টাইপ যাচাই করে। এর মাধ্যমে API-এর কার্যক্ষমতা এবং নিরাপত্তা বৃদ্ধি পায়।
FastAPI তে Pydantic Model ব্যবহার করে Request Body তৈরি করা খুবই সহজ এবং কার্যকর। Pydantic হলো একটি Python লাইব্রেরি যা ডাটা ভ্যালিডেশন এবং টাইপ এনোটেশনকে সহজ ও শক্তিশালী করে তোলে। FastAPI এই লাইব্রেরি ব্যবহার করে ইনপুট ডাটার টাইপ যাচাই, ডাটা ক্লিনিং এবং ভ্যালিডেশন স্বয়ংক্রিয়ভাবে সম্পাদন করে।
এখানে, আমরা দেখব কিভাবে Pydantic Model ব্যবহার করে FastAPI-তে Request Body তৈরি করা যায় এবং ইনপুট ডাটা ভ্যালিডেশন নিশ্চিত করা যায়।
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: একটি স্ট্রিং টাইপ ফিল্ড যা বাধ্যতামূলক (Required)।description: একটি ঐচ্ছিক স্ট্রিং (Optional) ফিল্ড।price: একটি ফ্লোট টাইপ ফিল্ড যা বাধ্যতামূলক।tax: একটি ঐচ্ছিক ফ্লোট টাইপ ফিল্ড।
Step 2: FastAPI-তে Request Body তৈরি করা
এখন আমরা Item মডেল ব্যবহার করে একটি API এন্ডপয়েন্ট তৈরি করব যা একটি POST রিকোয়েস্ট গ্রহণ করবে।
উদাহরণ: Request Body তৈরি
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 তে আপনি Pydantic মডেলের 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 with excellent performance",
"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"
}
]
}
Step 4: Optional Fields এবং Default Values
Pydantic মডেলগুলিতে Optional Fields এবং Default Values ব্যবহারের মাধ্যমে আপনি ঐচ্ছিক ডাটা এবং ডিফল্ট মান নির্ধারণ করতে পারেন।
উদাহরণ: Optional Fields এবং Default Values সহ Pydantic Model
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = "No description provided"
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"
}
Step 5: Complex Data Structures (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
@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"
}
}
FastAPI তে Pydantic Model ব্যবহার করে Request Body তৈরি করা সহজ এবং অত্যন্ত কার্যকর। এটি ইনপুট ডাটার টাইপ যাচাই, ভ্যালিডেশন এবং ডিফল্ট মান সেট করার কাজগুলি স্বয়ংক্রিয়ভাবে করে এবং একটি পরিষ্কার ও মডুলার কোডবেস তৈরি করতে সাহায্য করে। Pydantic মডেল ব্যবহারের মাধ্যমে আপনি বিভিন্ন ধরনের ভ্যালিডেশন, ঐচ্ছিক ফিল্ড এবং জটিল ডাটা স্ট্রাকচার তৈরি করতে পারেন।
FastAPI তে Form Data এবং File Upload হ্যান্ডলিং অত্যন্ত সহজ এবং কার্যকর। FastAPI Form, File, এবং UploadFile ব্যবহার করে HTML Form থেকে ডাটা গ্রহণ করতে এবং ফাইল আপলোড পরিচালনা করতে পারে। এই ডাটা ডেভেলপারের চাহিদা অনুযায়ী প্রক্রিয়া করা যায় এবং বিভিন্ন ধরনের ফর্ম্যাটে রেসপন্স প্রদান করা যায়।
Form Data হ্যান্ডলিং
Form Data সাধারণত HTML form ব্যবহার করে সার্ভারে পাঠানো হয়। FastAPI-তে Form Data হ্যান্ডলিংয়ের জন্য Form ডেকোরেটর ব্যবহৃত হয়।
উদাহরণ: Form Data গ্রহণ
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/submit-form/")
def submit_form(name: str = Form(...), age: int = Form(...)):
return {"name": name, "age": age}
এখানে:
nameএবংageহল ফর্ম প্যারামিটার, এবংForm(...)ডেকোরেটর দিয়ে আমরা ফর্ম ডাটা গ্রহণ করছি।
রিকোয়েস্ট উদাহরণ (HTML Form):
<form action="/submit-form/" method="post">
<input type="text" name="name" value="John Doe">
<input type="number" name="age" value="30">
<input type="submit">
</form>
রেসপন্স:
{
"name": "John Doe",
"age": 30
}
এখানে, ফর্ম ডাটা সফলভাবে সার্ভারে পাঠানো হয়েছে এবং সার্ভার সেই ডাটা ফিরিয়ে দিয়েছে।
File Upload হ্যান্ডলিং
FastAPI তে File Upload পরিচালনা করতে File এবং UploadFile ব্যবহার করা হয়। এই দুটি ক্লাসের সাহায্যে আপনি ফাইল আপলোড করতে পারেন এবং ফাইলের মেটাডেটা (ফাইল নাম, কনটেন্ট টাইপ) সংগ্রহ করতে পারেন।
উদাহরণ: ফাইল আপলোড
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
return {"filename": file.filename, "content_type": file.content_type}
এখানে:
UploadFile: ফাইল আপলোড করার জন্য FastAPI ক্লাস।File(...): ফাইল প্যারামিটার হিসেবে গ্রহণ করার জন্য ব্যবহৃত হয়।
রিকোয়েস্ট উদাহরণ (HTML Form):
<form action="/uploadfile/" enctype="multipart/form-data" method="post">
<input type="file" name="file">
<input type="submit">
</form>
রেসপন্স:
{
"filename": "example.txt",
"content_type": "text/plain"
}
এখানে, আপলোড করা ফাইলের নাম এবং কনটেন্ট টাইপ রেসপন্স হিসেবে প্রদান করা হয়েছে।
File Upload: File Content Access
FastAPI তে UploadFile ব্যবহার করে ফাইলের কনটেন্টও অ্যাক্সেস করা সম্ভব। আপনি ফাইলের কনটেন্ট পড়তে বা সেভ করতে পারেন। UploadFile একটি ফাইল অবজেক্ট হিসেবে কাজ করে, যা file.read() ব্যবহার করে ফাইলের কনটেন্ট পড়তে দেয়।
উদাহরণ: ফাইল কনটেন্ট পড়া
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
content = await file.read()
return {"filename": file.filename, "file_size": len(content)}
এখানে, ফাইলের কনটেন্ট file.read() দিয়ে পড়া হয়েছে এবং ফাইলের সাইজ রেসপন্স হিসেবে প্রদর্শিত হচ্ছে।
রেসপন্স (ফাইল সাইজ):
{
"filename": "example.txt",
"file_size": 1024
}
Multiple Files Upload
FastAPI তে একাধিক ফাইলও একসাথে আপলোড করা যায়। এটি করতে List[UploadFile] ব্যবহার করা হয়।
উদাহরণ: Multiple Files Upload
from fastapi import FastAPI, File, UploadFile
from typing import List
app = FastAPI()
@app.post("/uploadfiles/")
async def upload_files(files: List[UploadFile] = File(...)):
file_details = [{"filename": file.filename, "content_type": file.content_type} for file in files]
return {"uploaded_files": file_details}
এখানে, List[UploadFile] ব্যবহার করে একাধিক ফাইল গ্রহণ করা হচ্ছে।
রিকোয়েস্ট উদাহরণ:
<form action="/uploadfiles/" enctype="multipart/form-data" method="post">
<input type="file" name="files" multiple>
<input type="submit">
</form>
রেসপন্স:
{
"uploaded_files": [
{"filename": "file1.txt", "content_type": "text/plain"},
{"filename": "file2.jpg", "content_type": "image/jpeg"}
]
}
এখানে, দুইটি ফাইল একসাথে আপলোড করা হয়েছে এবং তাদের তথ্য রেসপন্সে দেখানো হয়েছে।
Form Data এবং File Upload একসাথে
FastAPI তে আপনি Form Data এবং File Upload একসাথে গ্রহণ করতে পারেন। আপনি Form এবং File ডেকোরেটর একসাথে ব্যবহার করে ফর্ম ডাটা এবং ফাইল একসাথে পাঠাতে পারবেন।
উদাহরণ: Form Data এবং File Upload একসাথে
from fastapi import FastAPI, File, Form, UploadFile
app = FastAPI()
@app.post("/upload/")
async def upload_file(name: str = Form(...), description: str = Form(...), file: UploadFile = File(...)):
file_content = await file.read()
return {"name": name, "description": description, "filename": file.filename, "file_size": len(file_content)}
এখানে:
nameএবংdescriptionফর্ম ডাটা হিসেবে গ্রহন করা হচ্ছে।fileফাইল হিসেবে আপলোড করা হচ্ছে।
রিকোয়েস্ট উদাহরণ (HTML Form):
<form action="/upload/" enctype="multipart/form-data" method="post">
<input type="text" name="name" value="Laptop">
<input type="text" name="description" value="A high-performance laptop">
<input type="file" name="file">
<input type="submit">
</form>
রেসপন্স:
{
"name": "Laptop",
"description": "A high-performance laptop",
"filename": "example.txt",
"file_size": 1024
}
FastAPI তে Form Data এবং File Upload হ্যান্ডলিং খুবই সহজ এবং শক্তিশালী। Form, File, এবং UploadFile ব্যবহার করে আপনি HTML ফর্ম ডাটা এবং ফাইল আপলোড গ্রহণ করতে পারেন, এবং ফাইলের কনটেন্ট প্রসেস করতে পারেন। একাধিক ফাইল, কনটেন্ট টাইপ যাচাই, এবং ফাইলের সাইজ বের করার মতো কাজগুলি সহজেই করা যায়। FastAPI এই সমস্ত কাজের জন্য একক ও কার্যকর সমাধান প্রদান করে, যা দ্রুত ডেভেলপমেন্টের জন্য খুবই উপযোগী।
FastAPI তে Request Body এর জন্য ভ্যালিডেশন এবং ডিফল্ট মান ব্যবস্থাপনা করা অত্যন্ত সহজ। Pydantic মডেল ব্যবহার করে আপনি ইনপুট ডাটার টাইপ, সীমাবদ্ধতা (constraints), এবং ডিফল্ট মান সেট করতে পারেন, যা FastAPI স্বয়ংক্রিয়ভাবে চেক করে এবং অ্যাপ্লিকেশনকে আরও নিরাপদ ও কার্যকর করে তোলে।
এখানে, আমরা Request Body এর জন্য ভ্যালিডেশন এবং ডিফল্ট মান কিভাবে ব্যবহৃত হয় তা ব্যাখ্যা করব।
Step 1: Pydantic Model তৈরি করা
FastAPI তে Request Body ভ্যালিডেশন করার জন্য Pydantic মডেল ব্যবহার করা হয়। Pydantic একটি Python লাইব্রেরি যা টাইপ সেফটি এবং ডাটা ভ্যালিডেশন সরবরাহ করে।
Pydantic মডেল উদাহরণ:
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., min_length=3, max_length=100) # Name ফিল্ডের জন্য ভ্যালিডেশন
description: str | None = Field(None, max_length=300) # Description ঐচ্ছিক, 300 অক্ষরের মধ্যে
price: float = Field(..., gt=0) # Price 0 এর বেশি হতে হবে
tax: float | None = Field(None, ge=0) # Tax ঐচ্ছিক, 0 এর সমান বা বেশি হতে হবে
এখানে:
name: একটি স্ট্রিং ফিল্ড, যার দৈর্ঘ্য কমপক্ষে ৩ এবং সর্বাধিক ১০০ অক্ষর হতে হবে।description: একটি ঐচ্ছিক স্ট্রিং ফিল্ড, যার দৈর্ঘ্য সর্বাধিক ৩০০ অক্ষর।price: একটি ফ্লোট টাইপ ফিল্ড, যার মান অবশ্যই ০ এর বেশি হবে।tax: একটি ঐচ্ছিক ফ্লোট টাইপ ফিল্ড, যার মান ০ এর সমান বা বেশি হতে হবে।
Step 2: Request Body তৈরির সময় ভ্যালিডেশন এবং ডিফল্ট মান প্রয়োগ
FastAPI তে Request Body (যেমন JSON) পাঠানোর সময়, Pydantic মডেলটি ইনপুট ডাটার জন্য স্বয়ংক্রিয়ভাবে ভ্যালিডেশন এবং ডিফল্ট মান অ্যাপ্লাই করবে।
উদাহরণ: Request Body তৈরি
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
name: str = Field(..., min_length=3, max_length=100)
description: str | None = Field(None, max_length=300)
price: float = Field(..., gt=0)
tax: float | None = Field(None, ge=0)
@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):
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
}
Step 3: ডিফল্ট মান নির্ধারণ
FastAPI তে Request Body মডেলগুলিতে আপনি ডিফল্ট মান (Default Value) সেট করতে পারেন। এটি ঐচ্ছিক ফিল্ডের জন্য ব্যবহৃত হয় এবং ডিফল্ট মান না পাঠানো হলে সেই মানটি ব্যবহৃত হবে।
উদাহরণ: ডিফল্ট মান সহ Pydantic Model
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., min_length=3, max_length=100)
description: str | None = Field("No description provided", max_length=300) # ডিফল্ট মান
price: float = Field(..., gt=0)
tax: float | None = Field(0.0, ge=0) # ডিফল্ট মান 0.0
এখানে:
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 এবং tax ফিল্ডগুলি পাঠানো হয়নি, তাই তাদের ডিফল্ট মান ব্যবহার করা হয়েছে।
Step 4: Validation Error Handling (ভ্যালিডেশন ত্রুটি)
যদি Request Body তে কোনও প্যারামিটার সঠিকভাবে না পাঠানো হয় বা যদি কোনো ভ্যালিডেশন শর্ত পূর্ণ না হয়, তবে FastAPI স্বয়ংক্রিয়ভাবে একটি ত্রুটি (error) রিটার্ন করবে।
উদাহরণ: Validation Error
{
"name": "A",
"price": -500.00
}
এখানে, name প্যারামিটারটি min_length=3 শর্ত পূর্ণ করতে পারেনি, এবং price প্যারামিটারটি gt=0 শর্ত পূর্ণ করতে পারেনি।
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["body", "name"],
"msg": "ensure this value has at least 3 characters",
"type": "value_error.any_str.min_length"
},
{
"loc": ["body", "price"],
"msg": "ensure this value is greater than 0",
"type": "value_error.number.gt"
}
]
}
এখানে, name এবং price প্যারামিটারগুলোর জন্য ভ্যালিডেশন ত্রুটি দেখানো হয়েছে।
Step 5: Custom Validation (কাস্টম ভ্যালিডেশন)
আপনি Pydantic মডেল-এ কাস্টম ভ্যালিডেশনও সংজ্ঞায়িত করতে পারেন, যা নির্দিষ্ট শর্ত পূর্ণ না হলে ত্রুটি দেখাবে।
উদাহরণ: কাস্টম ভ্যালিডেশন
from pydantic import BaseModel, root_validator, ValidationError
class Item(BaseModel):
name: str
price: float
tax: float | None = None
@root_validator
def check_price_and_tax(cls, values):
price = values.get("price")
tax = values.get("tax")
if tax and tax > price:
raise ValueError("Tax cannot be greater than price")
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 কাস্টম ভ্যালিডেটর ব্যবহার করে নিশ্চিত করা হয়েছে যে tax কখনো price এর চেয়ে বেশি হতে পারে না।
রিকোয়েস্ট উদাহরণ (ত্রুটি):
{
"name": "Laptop",
"price": 1000.00,
"tax": 1200.00
}
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["body"],
"msg": "Tax cannot be greater than price",
"type": "value_error"
}
]
}
FastAPI তে Request Body এর জন্য ভ্যালিডেশন এবং ডিফল্ট মান ব্যবস্থাপনা অত্যন্ত সহজ এবং শক্তিশালী। Pydantic মডেল ব্যবহার করে ইনপুট ডাটার টাইপ যাচাই, ভ্যালিডেশন কন্ডিশন (যেমন: gt, lt, min_length, max_length) এবং ডিফল্ট মান নির্ধারণ করতে পারেন। এটি ডেভেলপারদের কাজকে আরও সহজ করে তোলে এবং অ্যাপ্লিকেশনকে নিরাপদ এবং কার্যকর করে তোলে।
FastAPI-তে Request Body এর মাধ্যমে Complex Data হ্যান্ডলিং করা অত্যন্ত সহজ এবং কার্যকর। Pydantic মডেল ব্যবহার করে আমরা খুব সহজেই Nested Models, Lists, Dictionaries এবং অন্যান্য জটিল ডাটা স্ট্রাকচার হ্যান্ডল করতে পারি। FastAPI স্বয়ংক্রিয়ভাবে ইনপুট ডাটার টাইপ যাচাই, ভ্যালিডেশন, এবং ডেসিরিয়ালাইজেশন করে।
এখানে আমরা দেখব কিভাবে FastAPI তে Complex Data Structures যেমন Nested Models, List of Objects, Dictionaries, এবং অন্যান্য জটিল ডাটা হ্যান্ডলিং করা যায়।
Step 1: Nested Models (অন্য মডেলের মধ্যে মডেল)
FastAPI তে আপনি একটি মডেলের মধ্যে অন্য মডেল ব্যবহার করতে পারেন (Nested Models)। এর মাধ্যমে আপনি জটিল ডাটা স্ট্রাকচার তৈরি করতে পারবেন।
উদাহরণ: Nested Models
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# Manufacturer Model
class Manufacturer(BaseModel):
name: str
country: str
# Item Model (Nested Model)
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 Data):
{
"name": "Laptop",
"price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
রেসপন্স:
{
"item_name": "Laptop",
"item_price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
Step 2: List of Objects (Object এর তালিকা)
FastAPI তে আপনি List বা Array এর মধ্যে একাধিক মডেল ব্যবহার করতে পারেন। এটি ডাটা লিস্ট বা অ্যারের মাধ্যমে ইনপুট গ্রহণের জন্য খুবই কার্যকর।
উদাহরণ: List of Objects
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
app = FastAPI()
# Item Model
class Item(BaseModel):
name: str
price: float
@app.post("/items/")
def create_items(items: List[Item]):
return {"items": items}
এখানে, List[Item] ব্যবহার করা হয়েছে, যা ইনপুট হিসাবে একাধিক Item অবজেক্ট গ্রহণ করবে।
রিকোয়েস্ট উদাহরণ (List of Objects):
[
{"name": "Laptop", "price": 1500.00},
{"name": "Smartphone", "price": 800.00}
]
রেসপন্স:
{
"items": [
{"name": "Laptop", "price": 1500.00},
{"name": "Smartphone", "price": 800.00}
]
}
Step 3: Dictionary of Objects (অবজেক্টের ডিকশনারি)
FastAPI তে Dictionary বা Map এর মধ্যে key-value পেয়ার হিসেবে ডাটা গ্রহণ করতে পারেন। এর মাধ্যমে আপনি key এবং value এর মাধ্যমে complex data structures তৈরি করতে পারেন।
উদাহরণ: Dictionary of Objects
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Dict
app = FastAPI()
# Item Model
class Item(BaseModel):
name: str
price: float
@app.post("/items/")
def create_items(items: Dict[str, Item]):
return {"items": items}
এখানে, Dict[str, Item] ব্যবহার করা হয়েছে, যা key হিসেবে স্ট্রিং এবং value হিসেবে Item মডেল গ্রহণ করবে।
রিকোয়েস্ট উদাহরণ (Dictionary of Objects):
{
"item1": {"name": "Laptop", "price": 1500.00},
"item2": {"name": "Smartphone", "price": 800.00}
}
রেসপন্স:
{
"items": {
"item1": {"name": "Laptop", "price": 1500.00},
"item2": {"name": "Smartphone", "price": 800.00}
}
}
Step 4: Mixed Complex Data (নেস্টেড ডাটা, লিস্ট এবং ডিকশনারি)
FastAPI তে Mixed Complex Data ব্যবহার করে আপনি একসাথে Nested Models, Lists, এবং Dictionaries ব্যবহার করতে পারেন।
উদাহরণ: Mixed Complex Data
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List, Dict
app = FastAPI()
# Manufacturer Model
class Manufacturer(BaseModel):
name: str
country: str
# Item Model
class Item(BaseModel):
name: str
price: float
manufacturer: Manufacturer
# Order Model (Nested, List, Dictionary)
class Order(BaseModel):
order_id: int
items: List[Item]
shipping_address: Dict[str, str]
@app.post("/orders/")
def create_order(order: Order):
return {"order_id": order.order_id, "items": order.items, "shipping_address": order.shipping_address}
এখানে, Order মডেলটি একসাথে Item, List, এবং Dictionary মডেলগুলোর সংমিশ্রণ করেছে।
রিকোয়েস্ট উদাহরণ (Mixed Complex Data):
{
"order_id": 123,
"items": [
{"name": "Laptop", "price": 1500.00, "manufacturer": {"name": "TechCorp", "country": "USA"}},
{"name": "Smartphone", "price": 800.00, "manufacturer": {"name": "MobileTech", "country": "China"}}
],
"shipping_address": {
"street": "123 Main St",
"city": "New York",
"zip": "10001"
}
}
রেসপন্স:
{
"order_id": 123,
"items": [
{"name": "Laptop", "price": 1500.00, "manufacturer": {"name": "TechCorp", "country": "USA"}},
{"name": "Smartphone", "price": 800.00, "manufacturer": {"name": "MobileTech", "country": "China"}}
],
"shipping_address": {
"street": "123 Main St",
"city": "New York",
"zip": "10001"
}
}
Step 5: Validation and Constraints on Complex Data
FastAPI এবং Pydantic এর মাধ্যমে Complex Data এর জন্য validation এবং constraints ব্যবহার করা যায়। যেমন, min_length, max_length, gt, lt, regex ইত্যাদি।
উদাহরণ: Validation with Constraints on Complex Data
from pydantic import BaseModel, Field
from typing import List
class Item(BaseModel):
name: str = Field(..., min_length=3)
price: float = Field(..., gt=0)
class Order(BaseModel):
order_id: int
items: List[Item]
shipping_address: str
@app.post("/orders/")
def create_order(order: Order):
return {"order_id": order.order_id, "items": order.items, "shipping_address": order.shipping_address}
এখানে:
name: ৩টি অক্ষরের কম হবে না (min_length=3)।price: ০ এর বেশি হতে হবে (gt=0)।
FastAPI তে Request Body এর মাধ্যমে Complex Data হ্যান্ডলিং একটি শক্তিশালী বৈশিষ্ট্য। Pydantic মডেল ব্যবহার করে আপনি সহজেই Nested Models, Lists, Dictionaries, এবং Mixed Data Structures হ্যান্ডল করতে পারেন। এছাড়াও, ইনপুট ডাটার জন্য validation এবং constraints ব্যবহার করে ডাটা প্রক্রিয়া আরও নিরাপদ এবং নির্ভুল করা যায়। FastAPI এই সমস্ত ডাটা মডেলিং এবং হ্যান্ডলিং অপারেশনকে খুব সহজ ও দ্রুত করে তোলে।
Read more