FastAPI সহজেই কাস্টমাইজযোগ্য এবং এর বেসিক কনফিগারেশন ব্যবহার করে অ্যাপ্লিকেশনকে প্রয়োজন অনুযায়ী সাজানো যায়। এখানে FastAPI অ্যাপ্লিকেশনের বেসিক কনফিগারেশন সেটআপ নিয়ে বিস্তারিত আলোচনা করা হলো।
অ্যাপ ইনস্ট্যান্স কনফিগারেশন
FastAPI অ্যাপ তৈরি করার সময় বিভিন্ন প্যারামিটার ব্যবহার করা যায়:
from fastapi import FastAPI
app = FastAPI(
title="My FastAPI App", # অ্যাপ্লিকেশনের শিরোনাম
description="A sample FastAPI application", # অ্যাপ্লিকেশনের বিবরণ
version="1.0.0", # অ্যাপ্লিকেশনের সংস্করণ
docs_url="/api/docs", # Swagger UI এর কাস্টম URL
redoc_url="/api/redoc", # ReDoc এর কাস্টম URL
openapi_url="/api/openapi.json", # OpenAPI স্পেসিফিকেশনের URL
)
গুরুত্বপূর্ণ প্যারামিটার:
title: অ্যাপ্লিকেশনের নাম।description: অ্যাপ সম্পর্কে বিস্তারিত বিবরণ।version: অ্যাপের সংস্করণ।docs_url: Swagger UI এর কাস্টম URL (ডিফল্ট/docs)।redoc_url: ReDoc এর কাস্টম URL (ডিফল্ট/redoc)।openapi_url: OpenAPI স্পেসিফিকেশন JSON ফাইলের URL।
এন্ডপয়েন্ট কনফিগারেশন
FastAPI এ এন্ডপয়েন্ট কনফিগার করতে রাউটিং ব্যবহার করা হয়। উদাহরণ:
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "query": q}
প্যারামিটার:
item_id: ডাইনামিক পাথ প্যারামিটার।q: ঐচ্ছিক কোয়েরি প্যারামিটার।
মিডলওয়্যার কনফিগারেশন
মিডলওয়্যার ব্যবহার করে অ্যাপ্লিকেশনের প্রতিটি রিকোয়েস্ট এবং রেসপন্সের উপর প্রি-প্রসেসিং এবং পোস্ট-প্রসেসিং করা যায়।
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
app = FastAPI()
# CORS (Cross-Origin Resource Sharing) মিডলওয়্যার যুক্ত করা
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # কোন কোন ডোমেইন অ্যাক্সেস পাবে
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
ডাটাবেস কনফিগারেশন
FastAPI অ্যাপ্লিকেশনে ডাটাবেস যুক্ত করতে সাধারণত SQLAlchemy ব্যবহার করা হয়।
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
কাস্টম HTTP এক্সসেপশন হ্যান্ডলার
FastAPI-তে কাস্টম এক্সসেপশন হ্যান্ডলার যুক্ত করা যায়:
from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
app = FastAPI()
@app.exception_handler(HTTPException)
async def custom_http_exception_handler(request, exc):
return JSONResponse(
status_code=exc.status_code,
content={"message": f"Oops! {exc.detail}"}
)
লগিং কনফিগারেশন
লগিং সেটআপ করে ডেভেলপমেন্ট ও প্রোডাকশনে লগ ট্র্যাকিং সহজ করা যায়।
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@app.get("/log-example")
def log_example():
logger.info("This is an info log")
return {"message": "Check your logs!"}
Uvicorn সার্ভার কনফিগারেশন
Uvicorn ব্যবহার করে FastAPI অ্যাপ চালানোর সময় কাস্টম সেটিংস প্রয়োগ করা যায়:
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
গুরুত্বপূর্ণ ফ্ল্যাগ:
--host: সার্ভার হোস্ট ঠিকানা।--port: সার্ভার পোর্ট (ডিফল্ট: 8000)।--reload: ডেভেলপমেন্টের জন্য অটো-রিলোড।
OpenAPI কনফিগারেশন
FastAPI অ্যাপ্লিকেশনে OpenAPI স্পেসিফিকেশন কাস্টমাইজ করা যায়:
from fastapi.openapi.utils import get_openapi
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema = get_openapi(
title="Custom Title",
version="2.0.0",
description="This is a custom OpenAPI schema",
routes=app.routes,
)
app.openapi_schema = openapi_schema
return app.openapi_schema
app.openapi = custom_openapi
গুরুত্বপূর্ণ টিপস
- এন্ডপয়েন্টের জন্য ডকুমেন্টেশন যুক্ত করুন:
প্রতিটি এন্ডপয়েন্টেdocstringযোগ করুন, যা Swagger UI এবং ReDoc-এ প্রদর্শিত হবে। - মিডলওয়্যার সাবধানে ব্যবহার করুন:
অতিরিক্ত মিডলওয়্যার প্রয়োগ করলে পারফরম্যান্সে প্রভাব পড়তে পারে। - ডাটাবেস সংযোগ নিরাপদ রাখুন:
ডাটাবেস ইউআরএল বা কনফিগারেশন.envফাইলে সংরক্ষণ করুন এবংdotenvব্যবহার করে লোড করুন।
FastAPI এর বেসিক কনফিগারেশন সঠিকভাবে সেটআপ করলে অ্যাপ্লিকেশন ডেভেলপমেন্ট সহজ ও কার্যকর হয়। এই কনফিগারেশনগুলো বড় প্রজেক্টেও প্রাসঙ্গিক এবং স্কেলেবল প্রজেক্ট তৈরিতে সহায়ক।
FastAPI অ্যাপ্লিকেশনের একটি ভাল গঠিত স্ট্রাকচার ডেভেলপমেন্ট এবং মেইনটেন্যান্স সহজ করে। বড় ও জটিল প্রজেক্টের জন্য একটি মডুলার এবং স্কেলেবল ফোল্ডার স্ট্রাকচার প্রয়োজন। এখানে FastAPI অ্যাপ্লিকেশনের একটি সুপারিশকৃত স্ট্রাকচার দেওয়া হয়েছে।
স্ট্রাকচার উদাহরণ
my_fastapi_project/
├── app/
│ ├── main.py
│ ├── routes/
│ │ ├── __init__.py
│ │ ├── example_routes.py
│ ├── models/
│ │ ├── __init__.py
│ │ ├── example_models.py
│ ├── schemas/
│ │ ├── __init__.py
│ │ ├── example_schemas.py
│ ├── database.py
│ ├── __init__.py
├── tests/
│ ├── test_main.py
├── .env
├── requirements.txt
├── README.md
প্রতিটি ফোল্ডার এবং ফাইলের কাজ
app/main.py
এই ফাইলটি অ্যাপ্লিকেশনের এন্ট্রি পয়েন্ট। এটি FastAPI অবজেক্ট তৈরি করে এবং রাউট, ডাটাবেস, মিডলওয়্যার ইত্যাদি কনফিগার করে।
from fastapi import FastAPI
from app.routes import example_routes
app = FastAPI()
# রাউট অন্তর্ভুক্ত করা
app.include_router(example_routes.router)
@app.get("/")
def read_root():
return {"message": "Welcome to FastAPI"}
app/routes/
এই ফোল্ডারে অ্যাপ্লিকেশনের এন্ডপয়েন্ট বা রাউট সংজ্ঞায়িত করা হয়। প্রতিটি মডিউলের জন্য আলাদা ফাইল ব্যবহার করা হয়।
example_routes.py
from fastapi import APIRouter
router = APIRouter()
@router.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "query": q}
app/models/
এই ফোল্ডারে ডাটাবেস মডেল সংজ্ঞায়িত করা হয়। সাধারণত SQLAlchemy বা অন্য ORM ব্যবহার করা হয়।
example_models.py
from sqlalchemy import Column, Integer, String
from app.database import Base
class ExampleModel(Base):
__tablename__ = "examples"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
app/schemas/
এই ফোল্ডারে Pydantic ব্যবহার করে ডাটা যাচাইকরণ এবং ডাটা ট্রান্সফার অবজেক্ট তৈরি করা হয়।
example_schemas.py
from pydantic import BaseModel
class ExampleSchema(BaseModel):
name: str
description: str
class Config:
orm_mode = True
app/database.py
ডাটাবেসের সাথে সংযোগ স্থাপন এবং ORM সেটআপ করার জন্য ব্যবহৃত হয়।
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
tests/
এই ফোল্ডারে টেস্ট ফাইল রাখা হয়। FastAPI টেস্টিংয়ের জন্য pytest ব্যবহার করা হয়।
test_main.py
from fastapi.testclient import TestClient
from app.main import app
client = TestClient(app)
def test_read_root():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Welcome to FastAPI"}
.env
এই ফাইলটি পরিবেশ সংক্রান্ত ভ্যারিয়েবল সংরক্ষণে ব্যবহৃত হয়, যেমন ডাটাবেস URL বা API কীগুলি।
DATABASE_URL=sqlite:///./test.db
SECRET_KEY=mysecretkey
requirements.txt
FastAPI প্রজেক্টে ব্যবহৃত প্যাকেজগুলোর তালিকা সংরক্ষণ করা হয়। এটি ব্যবহার করে অন্য ডেভেলপার সহজে ডিপেনডেন্সি ইনস্টল করতে পারে।
fastapi
uvicorn
sqlalchemy
pydantic
pytest
python-dotenv
README.md
প্রজেক্ট সম্পর্কে বিস্তারিত তথ্য এবং সেটআপ নির্দেশিকা।
# My FastAPI Project
This is a sample FastAPI project.
## Setup Instructions
1. Install dependencies: `pip install -r requirements.txt`
2. Run the application: `uvicorn app.main:app --reload`
স্ট্রাকচার তৈরির সুবিধা
- পুনঃব্যবহারযোগ্যতা: প্রতিটি ফিচার বা মডিউল আলাদা ফোল্ডারে থাকায় সহজে ব্যবস্থাপনা করা যায়।
- স্কেলেবিলিটি: বড় প্রজেক্টের জন্য স্কেল করা সহজ।
- পরিচ্ছন্ন কোডবেস: নির্দিষ্ট ফোল্ডারে নির্দিষ্ট ফিচার রাখার ফলে কোড আরও গঠনমূলক হয়।
- সহজ টেস্টিং: আলাদা টেস্ট ফোল্ডার রাখার ফলে সহজে টেস্টিং করা যায়।
FastAPI অ্যাপ্লিকেশন স্ট্রাকচার পরিষ্কার ও সুগঠিত রাখলে প্রজেক্ট ডেভেলপমেন্ট আরও কার্যকর এবং দীর্ঘমেয়াদে সহজ হয়। এই স্ট্রাকচার অনুসরণ করে আপনি স্কেলেবল ও মডুলার অ্যাপ তৈরি করতে পারবেন।
FastAPI-তে Route (এন্ডপয়েন্ট) তৈরি করা API ডেভেলপমেন্টের একটি প্রধান অংশ। Route-এর মাধ্যমে অ্যাপ্লিকেশন নির্দিষ্ট URL এবং HTTP মেথডের (GET, POST, PUT, DELETE) জন্য কার্যকলাপ পরিচালনা করে।
Route তৈরি করা
FastAPI-তে একটি Route তৈরি করতে, ডেকোরেটর এবং পাথ প্যারামিটার ব্যবহার করা হয়।
উদাহরণ:
from fastapi import FastAPI
app = FastAPI()
# রুট এন্ডপয়েন্ট (Root Endpoint)
@app.get("/")
def read_root():
return {"message": "Welcome to FastAPI"}
# ডাইনামিক এন্ডপয়েন্ট
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "query": q}
ব্যাখ্যা:
@app.get("/"):
এটি একটি GET রিকোয়েস্টের জন্য রুট এন্ডপয়েন্ট তৈরি করে।@app.get("/items/{item_id}"):
এখানে{item_id}একটি ডাইনামিক পাথ প্যারামিটার, যা URL থেকে ডাটা গ্রহণ করে।
Route কনফিগার করা
১. স্ট্যাটিক এবং ডাইনামিক Route
স্ট্যাটিক Route:
একটি নির্দিষ্ট পাথের জন্য ব্যবহৃত হয়।@app.get("/about") def about(): return {"info": "This is a static route"}ডাইনামিক Route:
পাথ প্যারামিটার ব্যবহার করে ডাইনামিক ডাটা গ্রহণ করে।@app.get("/users/{user_id}") def get_user(user_id: int): return {"user_id": user_id}
২. কোয়েরি প্যারামিটার যুক্ত করা
Route-এ কোয়েরি প্যারামিটার ব্যবহার করে অতিরিক্ত ডাটা গ্রহণ করা যায়।
@app.get("/search")
def search_items(keyword: str, limit: int = 10):
return {"keyword": keyword, "limit": limit}
উদাহরণ URL:
http://127.0.0.1:8000/search?keyword=fastapi&limit=5
রেসপন্স:
{
"keyword": "fastapi",
"limit": 5
}
৩. Route-এ HTTP মেথড নির্ধারণ করা
FastAPI বিভিন্ন HTTP মেথডের জন্য Route সমর্থন করে।
- GET: ডাটা পড়ার জন্য।
- POST: ডাটা তৈরি করার জন্য।
- PUT: ডাটা আপডেট করার জন্য।
- DELETE: ডাটা মুছে ফেলার জন্য।
@app.post("/create-item/")
def create_item(name: str):
return {"item_name": name}
@app.put("/update-item/{item_id}")
def update_item(item_id: int, name: str):
return {"item_id": item_id, "updated_name": name}
@app.delete("/delete-item/{item_id}")
def delete_item(item_id: int):
return {"message": f"Item {item_id} deleted"}
Route মডুলার করা
Route-গুলোকে মডুলার করতে APIRouter ব্যবহার করা হয়।
Route ফাইল: routes/example_routes.py
from fastapi import APIRouter
router = APIRouter()
@router.get("/example")
def example_route():
return {"message": "This is an example route"}
@router.post("/example")
def create_example(name: str):
return {"message": f"Example created with name {name}"}
Route অ্যাপের সাথে যুক্ত করা: main.py
from fastapi import FastAPI
from app.routes import example_routes
app = FastAPI()
# Route যুক্ত করা
app.include_router(example_routes.router, prefix="/api/v1")
এন্ডপয়েন্ট উদাহরণ:
- GET:
/api/v1/example - POST:
/api/v1/example
Route-এ কাস্টমাইজড প্যারামিটার
কাস্টম HTTP এক্সসেপশন:
from fastapi import HTTPException
@app.get("/users/{user_id}")
def get_user(user_id: int):
if user_id < 1:
raise HTTPException(status_code=400, detail="Invalid user ID")
return {"user_id": user_id}
ডিফল্ট প্যারামিটার:
@app.get("/items/")
def read_items(limit: int = 10, offset: int = 0):
return {"limit": limit, "offset": offset}
Route ডকুমেন্টেশন যুক্ত করা
Docstring ব্যবহার:
@app.get("/items/{item_id}", summary="Get an item", description="Retrieve an item by its ID.")
def read_item(item_id: int):
"""
Args:
item_id (int): The ID of the item to retrieve.
Returns:
dict: The item details.
"""
return {"item_id": item_id}
ডেকোরেটরের প্যারামিটার ব্যবহার:
@app.post("/create-item/", summary="Create a new item")
def create_item(name: str):
return {"item_name": name}
Route-এর জন্য Swagger UI এবং ReDoc
FastAPI স্বয়ংক্রিয়ভাবে Route-এর ডকুমেন্টেশন তৈরি করে।
Swagger UI: http://127.0.0.1:8000/docs
ReDoc: http://127.0.0.1:8000/redoc
FastAPI-তে Route তৈরি এবং কনফিগার করা সহজ এবং শক্তিশালী। এর মডুলার ডিজাইন বড় অ্যাপ্লিকেশন তৈরি ও পরিচালনা সহজ করে তোলে। Route-এর সঠিক ব্যবহার ডেভেলপমেন্টে কার্যক্ষমতা এবং পরিষ্কার কোড বজায় রাখতে সাহায্য করে।
FastAPI-তে Request Model এবং Response Model ব্যবহার করে ইনপুট ও আউটপুট ডাটা স্ট্রাকচার সহজেই সংজ্ঞায়িত করা যায়। Pydantic ব্যবহার করে এই মডেলগুলো তৈরি করা হয়, যা ডাটা যাচাই (validation) এবং টাইপিং নিশ্চিত করে।
Request Model কনফিগারেশন
Request Model তৈরি করা
Pydantic-এর BaseModel ব্যবহার করে Request Model তৈরি করা হয়। এটি ইনপুট ডাটার কাঠামো এবং যাচাই নির্ধারণ করে।
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
Request Model ব্যবহার করা
FastAPI এন্ডপয়েন্টে Request Model ইনপুট হিসেবে ব্যবহার করা যায়।
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
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": item}
ইনপুট উদাহরণ:
POST /items/
Body:
{
"name": "Laptop",
"description": "A high-end gaming laptop",
"price": 1500.00,
"tax": 120.00
}
রেসপন্স উদাহরণ:
{
"item": {
"name": "Laptop",
"description": "A high-end gaming laptop",
"price": 1500.00,
"tax": 120.00
}
}
Response Model কনফিগারেশন
Response Model তৈরি করা
Response Model নির্ধারণ করতে BaseModel ব্যবহার করা হয়। এটি API-এর রেসপন্স ডাটার কাঠামো নিশ্চিত করে।
from pydantic import BaseModel
class ItemResponse(BaseModel):
name: str
price_with_tax: float
Response Model ব্যবহার করা
Response Model response_model প্যারামিটারের মাধ্যমে FastAPI এন্ডপয়েন্টে যুক্ত করা হয়।
@app.post("/items/", response_model=ItemResponse)
def create_item(item: Item):
price_with_tax = item.price + (item.tax or 0)
return {"name": item.name, "price_with_tax": price_with_tax}
রেসপন্স উদাহরণ:
{
"name": "Laptop",
"price_with_tax": 1620.00
}
Request এবং Response Model একত্রে ব্যবহার
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
class ItemResponse(BaseModel):
name: str
total_price: float
@app.post("/items/", response_model=ItemResponse)
def create_item(item: Item):
total_price = item.price + (item.tax or 0)
return {"name": item.name, "total_price": total_price}
POST রিকোয়েস্ট:
Body:
{
"name": "Smartphone",
"price": 1000.00,
"tax": 100.00
}
রেসপন্স:
{
"name": "Smartphone",
"total_price": 1100.00
}
Model Field কাস্টমাইজেশন
Pydantic-এর ফিচার ব্যবহার করে মডেলের ফিল্ড কাস্টমাইজ করা যায়।
Field ডিফল্ট মান এবং যাচাই
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., example="Laptop") # ফিল্ডের উদাহরণ
description: str | None = Field(None, max_length=300, example="A lightweight laptop")
price: float = Field(..., gt=0, example=999.99) # `gt=0` দিয়ে নিশ্চিত করা হয়েছে যে দাম শূন্যের বেশি হবে
tax: float | None = Field(None, example=99.99)
এন্ডপয়েন্টে উদাহরণ ডাটা দেখানো
FastAPI স্বয়ংক্রিয়ভাবে Swagger UI-তে উদাহরণ ডাটা প্রদর্শন করতে পারে।
@app.post("/items/", response_model=ItemResponse)
def create_item(item: Item):
"""
এই এন্ডপয়েন্ট একটি নতুন আইটেম তৈরি করে।
"""
total_price = item.price + (item.tax or 0)
return {"name": item.name, "total_price": total_price}
Swagger UI এ উদাহরণ:
Request Body Example:
{
"name": "Tablet",
"description": "A new generation tablet",
"price": 500.00,
"tax": 50.00
}
Optional এবং Nested Model
Optional ফিল্ড:
class Item(BaseModel):
name: str
description: str | None = None # ঐচ্ছিক ফিল্ড
Nested Model:
class Manufacturer(BaseModel):
name: str
country: str
class Item(BaseModel):
name: str
price: float
manufacturer: Manufacturer # Nested Model
উদাহরণ ইনপুট:
{
"name": "Laptop",
"price": 1500.00,
"manufacturer": {
"name": "TechCorp",
"country": "USA"
}
}
Response Data ফিল্টারিং
Response Model ব্যবহার করে ডাটা ফিল্টার করা যায়। যেমন:
class FullItem(BaseModel):
name: str
description: str
price: float
tax: float
class FilteredItem(BaseModel):
name: str
price: float
@app.post("/items/", response_model=FilteredItem)
def create_item(item: FullItem):
return item
ইনপুট:
{
"name": "Laptop",
"description": "A powerful gaming laptop",
"price": 1500.00,
"tax": 120.00
}
রেসপন্স:
{
"name": "Laptop",
"price": 1500.00
}
Request এবং Response Model ব্যবহার করে FastAPI অ্যাপের ইনপুট এবং আউটপুট সহজেই যাচাই এবং নিয়ন্ত্রণ করা যায়। এটি ডেভেলপারদের জন্য একটি শক্তিশালী টুল, যা কোড মডুলার এবং সহজবোধ্য রাখে।
FastAPI তে Path Parameters এবং Query Parameters ব্যবহার করা খুবই সহজ। এদের মাধ্যমে আপনি URL-এর অংশ হিসেবে ডাটা গ্রহণ (Path Parameters) বা URL এর শেষে কোয়েরি স্ট্রিং (Query Parameters) ব্যবহার করে ডাটা পাঠাতে পারেন।
Path Parameters ব্যবস্থাপনা
Path Parameters হল URL-এর মধ্যে {} ব্র্যাকেটের মধ্যে প্যারামিটার পাঠানো। এটি ডাইনামিক রাউটিংয়ের জন্য ব্যবহার করা হয়।
Path Parameter উদাহরণ:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
এখানে, item_id হল একটি Path Parameter, যা URL থেকে গ্রহণ করা হয়।
রিকোয়েস্ট উদাহরণ:
GET /items/123
রেসপন্স:
{
"item_id": 123
}
Query Parameters ব্যবস্থাপনা
Query Parameters URL-এর শেষে ? দিয়ে শুরু হয়ে & দিয়ে আলাদা করা প্যারামিটার পাঠানো হয়। এগুলি ঐচ্ছিক এবং URL-এ যোগ করা হয়, যেমন /items?q=example&limit=5।
Query Parameter উদাহরণ:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
def read_items(q: str = None, limit: int = 10):
return {"query": q, "limit": limit}
এখানে, q এবং limit হল Query Parameters। q ঐচ্ছিক এবং limit এর ডিফল্ট মান 10।
রিকোয়েস্ট উদাহরণ:
GET /items/?q=fastapi&limit=5
রেসপন্স:
{
"query": "fastapi",
"limit": 5
}
Path এবং Query Parameters একসাথে ব্যবহারের উদাহরণ
FastAPI-তে Path Parameters এবং Query Parameters একসাথে ব্যবহার করা যায়। Path Parameters URL এর অংশ হিসেবে এবং Query Parameters URL এর শেষে আসবে।
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "query": q}
এখানে item_id হল Path Parameter এবং q হল Query Parameter।
রিকোয়েস্ট উদাহরণ:
GET /items/123?q=example
রেসপন্স:
{
"item_id": 123,
"query": "example"
}
Path Parameters এর টাইপ কাস্টমাইজেশন
FastAPI এর সাহায্যে Path Parameters এর ডাটা টাইপ কাস্টমাইজ করা যায়। যেমন, আপনি সংখ্যা (int), স্ট্রিং (str), এবং অন্যান্য টাইপ ব্যবহার করতে পারেন।
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
এখানে, item_id একটি int টাইপ, FastAPI এটি স্বয়ংক্রিয়ভাবে যাচাই করবে।
রিকোয়েস্ট উদাহরণ:
GET /items/123
রেসপন্স:
{
"item_id": 123
}
এছাড়া আপনি float, str, bool এবং অন্যান্য টাইপও ব্যবহার করতে পারেন।
Required Query Parameters
Query Parameters সাধারণত ঐচ্ছিক হয়, তবে আপনি তাদের required (অবশ্যই থাকা উচিত) করতে পারেন।
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
def read_item(q: str):
return {"query": q}
এখানে, q একটি required Query Parameter। যদি আপনি q পাঠান না, FastAPI আপনাকে ত্রুটি দেখাবে।
রিকোয়েস্ট উদাহরণ:
GET /items/?q=example
রেসপন্স:
{
"query": "example"
}
Query Parameter Default Value
Query Parameters এর জন্য আপনি ডিফল্ট মান নির্ধারণ করতে পারেন। এটি ব্যবহারকারী যদি কোন প্যারামিটার না পাঠায়, তখন ডিফল্ট মান ব্যবহার করা হবে।
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
def read_items(q: str = "default"):
return {"query": q}
এখানে, যদি q পাঠানো না হয়, তবে "default" মান ব্যবহার হবে।
রিকোয়েস্ট উদাহরণ:
GET /items/ (Query Parameter না পাঠানো হলে)
রেসপন্স:
{
"query": "default"
}
Validation and Constraints on Query Parameters
FastAPI-এর মাধ্যমে আপনি Query Parameters এর জন্য validation এবং constraints (সীমাবদ্ধতা) নির্ধারণ করতে পারেন।
from fastapi import FastAPI
from pydantic import conint
app = FastAPI()
@app.get("/items/")
def read_items(skip: int = 0, limit: conint(ge=1, le=100) = 10):
return {"skip": skip, "limit": limit}
এখানে, limit Query Parameter এর জন্য 1 থেকে 100 এর মধ্যে একটি মান থাকতে হবে। conint(ge=1, le=100) এর মাধ্যমে এই সিমান্ত নির্ধারণ করা হয়েছে।
রিকোয়েস্ট উদাহরণ:
GET /items/?limit=50
রেসপন্স:
{
"skip": 0,
"limit": 50
}
FastAPI-তে Path Parameters এবং Query Parameters ব্যবস্থাপনা সহজ এবং শক্তিশালী। Path Parameters URL-এর অংশ হিসেবে ডাটা গ্রহণ করে, আর Query Parameters URL এর শেষে অতিরিক্ত ডাটা পাঠানোর জন্য ব্যবহার করা হয়। FastAPI এই প্যারামিটারগুলির জন্য স্বয়ংক্রিয়ভাবে ডাটা টাইপ যাচাই, ডিফল্ট মান এবং সিমান্ত কনফিগারেশন সহ একটি শক্তিশালী সমাধান সরবরাহ করে।
FastAPI তে Path Parameters এর মাধ্যমে URL-এর অংশ হিসেবে ডাটা গ্রহণ করা হয় এবং Type Validation এর মাধ্যমে ডাটার টাইপ স্বয়ংক্রিয়ভাবে যাচাই করা হয়। FastAPI-এর টাইপ সিস্টেম এবং পিডেন্টিক (Pydantic) এর সাহায্যে এটি অত্যন্ত সহজ এবং শক্তিশালী হয়ে ওঠে।
Path Parameters ব্যবস্থাপনা
Path Parameters URL পাথের অংশ হিসেবে ডাটা পাঠানোর উপায়। FastAPI-তে Path Parameters ব্যবহার করতে {} ব্র্যাকেটের মধ্যে প্যারামিটার ডিফাইন করা হয়।
উদাহরণ:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
এখানে, item_id হল Path Parameter এবং এটি URL থেকে ইনপুট হিসেবে গ্রহণ করা হয়। FastAPI স্বয়ংক্রিয়ভাবে এই প্যারামিটারটির টাইপ যাচাই করে, যেহেতু এখানে item_id একটি int টাইপ হিসেবে ডিফাইন করা হয়েছে।
রিকোয়েস্ট উদাহরণ:
GET /items/123
রেসপন্স:
{
"item_id": 123
}
এখানে, item_id স্বয়ংক্রিয়ভাবে int হিসাবে পার্স করা হবে।
Type Validation
FastAPI-তে Path Parameters এবং Query Parameters উভয়ের জন্যই টাইপ যাচাই অত্যন্ত সহজ। প্যারামিটারটির টাইপ ডিফাইন করলে, FastAPI স্বয়ংক্রিয়ভাবে ইনপুট ডাটার যাচাই করে এবং যদি টাইপ মিলে না যায়, তাহলে এটি একটি ত্রুটি প্রদান করবে।
উদাহরণ: টাইপ যাচাই সহ Path Parameter
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
এখানে, item_id টাইপ int হিসেবে নির্ধারিত, এবং যদি ব্যবহারকারী কোনো স্ট্রিং পাঠায়, FastAPI স্বয়ংক্রিয়ভাবে ত্রুটি দেখাবে।
রিকোয়েস্ট উদাহরণ (ভুল টাইপ):
GET /items/abc
রেসপন্স (ত্রুটি):
{
"detail": [
{
"loc": ["path", "item_id"],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}
এখানে, FastAPI নিশ্চিত করেছে যে item_id একটি সংখ্যা হওয়া উচিত, এবং এটি একটি ত্রুটি দেখিয়েছে কারণ পাঠানো মান (abc) সংখ্যা নয়।
Path Parameters-এর বিভিন্ন টাইপের Validation
FastAPI আপনাকে বিভিন্ন টাইপের Path Parameters ব্যবহার করার সুযোগ দেয়, যেমন int, str, float, bool ইত্যাদি। প্রতিটি টাইপের জন্য FastAPI নিজেই ভ্যালিডেশন করে থাকে।
উদাহরণ: বিভিন্ন টাইপের Path Parameter
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
@app.get("/user/{username}")
def get_user(username: str):
return {"username": username}
@app.get("/price/{price}")
def get_price(price: float):
return {"price": price}
রিকোয়েস্ট উদাহরণ:
GET
/items/123
রেসপন্স:{"item_id": 123}GET
/user/johndoe
রেসপন্স:{"username": "johndoe"}GET
/price/19.99
রেসপন্স:{"price": 19.99}
টাইপ যাচাই:
- GET
/items/abc: টাইপintহওয়ার কারণে ত্রুটি। - GET
/user/123: টাইপstrহওয়ার কারণে এটি সঠিকভাবে পাস হবে। - GET
/price/abc: টাইপfloatহওয়ার কারণে ত্রুটি।
Path Parameters-এর জন্য কাস্টম টাইপ Validation
আপনি নিজের কাস্টম টাইপও তৈরি করতে পারেন এবং FastAPI তাতে টাইপ যাচাই চালাতে পারে। যেমন, আপনি কোনো নির্দিষ্ট প্যাটার্নের জন্য টাইপ যাচাই করতে পারেন।
উদাহরণ: কাস্টম টাইপ Validation
from fastapi import FastAPI, Path
from pydantic import constr
app = FastAPI()
# কাস্টম টাইপ
@app.get("/items/{item_code}")
def read_item(item_code: constr(regex=r"^[A-Za-z0-9_]+$")):
return {"item_code": item_code}
এখানে, item_code একটি কাস্টম টাইপ যা শুধুমাত্র অক্ষর, সংখ্যা এবং আন্ডারস্কোর (_) অনুমোদন করে। এর জন্য আমরা constr(regex=...) ব্যবহার করেছি, যা একটি নিয়মিত অভিব্যক্তির মাধ্যমে টাইপ যাচাই করে।
রিকোয়েস্ট উদাহরণ:
GET /items/abc_123
রেসপন্স:
{
"item_code": "abc_123"
}
GET /items/abc!123
রেসপন্স:
{
"detail": [
{
"loc": ["path", "item_code"],
"msg": "string does not match regex \"^[A-Za-z0-9_]+$\"",
"type": "value_error.str.regex"
}
]
}
Path Parameters-এ অন্যান্য সিমান্ত (Constraints)
FastAPI-তে আপনি Path Parameters-এর জন্য min, max, gt, lt, ge, le ইত্যাদি সিমান্ত (constraints) ব্যবহার করতে পারেন।
উদাহরণ: সিমান্ত যুক্ত Path Parameter
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int = Path(..., gt=0, le=100)):
return {"item_id": item_id}
এখানে, item_id অবশ্যই 0 এর বেশি এবং 100 এর সমান বা কম হতে হবে।
রিকোয়েস্ট উদাহরণ:
GET /items/50
রেসপন্স:
{
"item_id": 50
}
GET /items/150
রেসপন্স:
{
"detail": [
{
"loc": ["path", "item_id"],
"msg": "ensure this value is less than or equal to 100",
"type": "value_error.number.not_le"
}
]
}
FastAPI তে Path Parameters এবং Type Validation ব্যবস্থাপনা অত্যন্ত সহজ এবং শক্তিশালী। Path Parameters-এর জন্য টাইপ যাচাই স্বয়ংক্রিয়ভাবে পরিচালিত হয় এবং যদি টাইপ বা কাস্টম কনস্ট্রেইন্টে ত্রুটি ঘটে, FastAPI তা দ্রুত সনাক্ত করে এবং ডেভেলপারকে ত্রুটির বিষয়ে জানায়। এই বৈশিষ্ট্য FastAPI কে আরও কার্যক্ষম এবং ব্যবহারবান্ধব করে তোলে।
Read more