FastAPI তে Dependency Injection একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা কোডকে আরও মডুলার, টেস্টযোগ্য এবং পুনঃব্যবহারযোগ্য করে তোলে। Global Dependency এবং Scoped Dependency FastAPI অ্যাপ্লিকেশনের মধ্যে বিভিন্ন ধরনের নির্ভরশীলতা পরিচালনা করতে ব্যবহৃত হয়।
Dependency Injection কী?
Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যেখানে একটি অবজেক্টের নির্ভরশীলতা অন্য এক অবজেক্ট সরবরাহ করে (ইনজেক্ট করে)। FastAPI-তে, আপনি ফাংশন এবং ক্লাসগুলির জন্য নির্ভরশীলতা নির্ধারণ করতে পারেন এবং এটি FastAPI-এর মাধ্যমে স্বয়ংক্রিয়ভাবে পরিচালিত হয়।
Dependency Injection ব্যবহারের সুবিধা:
- কোড পুনঃব্যবহারযোগ্যতা বাড়ানো।
- কোডের বিচ্ছিন্নতা (Separation of Concerns) নিশ্চিত করা।
- অ্যাপ্লিকেশনটিকে আরও সহজে টেস্ট করা সম্ভব করা।
Global Dependency
Global Dependency হলো একটি নির্ভরশীলতা যা পুরো FastAPI অ্যাপ্লিকেশন জুড়ে উপলব্ধ থাকে। এটি অ্যাপ্লিকেশন-এর প্রতিটি এন্ডপয়েন্টে ব্যবহৃত হতে পারে। সাধারণত, Depends কনস্ট্রাক্টরের মাধ্যমে এটি ইনজেক্ট করা হয়।
Global Dependency উদাহরণ:
from fastapi import FastAPI, Depends
app = FastAPI()
# Global Dependency Function
def get_query_param(q: str = "default"):
return q
@app.get("/items/")
def read_item(query: str = Depends(get_query_param)):
return {"query": query}
এখানে, get_query_param হল একটি Global Dependency যেটি /items/ এন্ডপয়েন্টে Depends(get_query_param) এর মাধ্যমে ইনজেক্ট করা হয়েছে।
রিকোয়েস্ট উদাহরণ:
GET /items/?q=test
রেসপন্স:
{
"query": "test"
}
এটি যখন কোন প্যারামিটার পাঠানো হয় না, তখন q="default" হবে।
Scoped Dependency
Scoped Dependency একটি নির্ভরশীলতা যা একটি নির্দিষ্ট সময়কাল বা কনটেক্সট পর্যন্ত সীমাবদ্ধ থাকে, যেমন একটি নির্দিষ্ট HTTP রিকোয়েস্ট। FastAPI-তে Scoped Dependency মূলত HTTP রিকোয়েস্ট লাইফসাইকেলের সাথে সম্পর্কিত থাকে, অর্থাৎ প্রতি রিকোয়েস্টে নতুন ইন্সট্যান্স তৈরি করা হয় এবং রিকোয়েস্টটি শেষ হলে সেই নির্ভরশীলতা ধ্বংস হয়ে যায়।
Scoped Dependency উদাহরণ:
from fastapi import FastAPI, Depends
app = FastAPI()
# Scoped Dependency Function
def get_db():
db = "Database Connection" # এখানে সিমুলেটেড ডাটাবেস কনেকশন
try:
yield db
finally:
db = None # এখানে ডাটাবেস কানেকশন ক্লোজ হবে
@app.get("/users/")
def read_users(db: str = Depends(get_db)):
return {"db": db}
এখানে, get_db হল একটি Scoped Dependency, যা একটি নির্দিষ্ট HTTP রিকোয়েস্টের সময়ে ইনজেক্ট করা হয় এবং রিকোয়েস্ট শেষ হলে yield ব্যবহৃত হয়ে ডাটাবেস কানেকশনটি ক্লোজ হয়।
রিকোয়েস্ট উদাহরণ:
GET /users/
রেসপন্স:
{
"db": "Database Connection"
}
Scoped Dependency সাধারণত ডাটাবেস সংযোগ, কেশ, এবং অন্যান্য রিকোয়েস্ট-ভিত্তিক ডাটা হ্যান্ডল করার জন্য ব্যবহৃত হয়।
Global এবং Scoped Dependency-র মধ্যে পার্থক্য
| বৈশিষ্ট্য | Global Dependency | Scoped Dependency |
|---|---|---|
| ব্যবহার | অ্যাপ্লিকেশন জুড়ে ব্যবহৃত | প্রতিটি HTTP রিকোয়েস্টের জন্য |
| এনজেক্ট হওয়া | একবার, পুরো অ্যাপের জন্য | প্রতিটি রিকোয়েস্টের জন্য |
| নির্ভরশীলতা লাইফটাইম | অ্যাপের সাথে থাকছে | রিকোয়েস্ট শেষ হলে ধ্বংস হয় |
| উদাহরণ | API কনফিগারেশন, অ্যাপ্লিকেশন সেটিংস | ডাটাবেস কানেকশন, লগিং |
Dependency Injection ব্যবহার করে Authorization এবং Authentication
Dependency Injection ব্যবহার করে আপনি authorization এবং authentication পরিচালনা করতে পারেন, যেমন JWT টোকেন বা OAuth2 ভিত্তিক অথেনটিকেশন। নিচে একটি উদাহরণ দেওয়া হলো যেখানে OAuth2-এর মাধ্যমে ডিপেনডেন্সি তৈরি করা হয়েছে।
OAuth2 Scoped Dependency উদাহরণ:
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
def get_current_user(token: str = Depends(oauth2_scheme)):
if token != "valid-token":
raise HTTPException(status_code=401, detail="Invalid token")
return {"username": "test_user"}
@app.get("/users/me")
def read_users_me(current_user: dict = Depends(get_current_user)):
return {"current_user": current_user}
এখানে, get_current_user একটি Scoped Dependency, যা OAuth2 টোকেন যাচাই করতে ব্যবহৃত হয়েছে। এটি কেবল সেই রিকোয়েস্টের জন্য কার্যকর যা একটি সঠিক টোকেন প্রদান করে।
FastAPI তে Global Dependency এবং Scoped Dependency ব্যবহারের মাধ্যমে আপনি অ্যাপ্লিকেশনের নির্ভরশীলতা আরও কার্যকরভাবে এবং মডুলারভাবে পরিচালনা করতে পারেন। Global Dependency আপনাকে অ্যাপ্লিকেশন জুড়ে ব্যবহৃত ফাংশন বা সেটিংস এর জন্য সুবিধা দেয়, যখন Scoped Dependency HTTP রিকোয়েস্টের সাথে সম্পর্কিত নির্ভরশীলতা হ্যান্ডল করতে সাহায্য করে, যেমন ডাটাবেস সংযোগ বা লগিং। Dependency Injection-এর মাধ্যমে কোডের বিচ্ছিন্নতা এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়, এবং অ্যাপ্লিকেশন টেস্টিং আরও সহজ হয়।
Read more