কাস্টম ব্যতিক্রম হ্যান্ডলার ব্যবহার করে ফাস্টএপিআই ত্রুটি হ্যান্ডলিং mastered করুন। আরও ভাল ব্যবহারকারীর অভিজ্ঞতার জন্য ত্রুটি প্রতিক্রিয়া সরবরাহ করুন।
পাইথন ফাস্টএপিআই ত্রুটি হ্যান্ডলিং: শক্তিশালী কাস্টম ব্যতিক্রম হ্যান্ডলার তৈরি করা
ত্রুটি হ্যান্ডলিং শক্তিশালী এবং নির্ভরযোগ্য এপিআই তৈরির একটি গুরুত্বপূর্ণ দিক। পাইথনের ফাস্টএপিআই-এ, আপনি ত্রুটিগুলি সুন্দরভাবে পরিচালনা করতে এবং ক্লায়েন্টদের তথ্যপূর্ণ প্রতিক্রিয়া সরবরাহ করতে কাস্টম ব্যতিক্রম হ্যান্ডলারগুলি ব্যবহার করতে পারেন। এই ব্লগ পোস্টটি আপনাকে ফাস্টএপিআই-এ কাস্টম ব্যতিক্রম হ্যান্ডলার তৈরি করার প্রক্রিয়ার মাধ্যমে গাইড করবে, যা আপনাকে আরও স্থিতিস্থাপক এবং ব্যবহারকারী-বান্ধব অ্যাপ্লিকেশন তৈরি করতে সক্ষম করবে।
কেন কাস্টম ব্যতিক্রম হ্যান্ডলার?
ফাস্টএপিআই ব্যতিক্রম হ্যান্ডলিংয়ের জন্য অন্তর্নির্মিত সমর্থন সরবরাহ করে। তবে, শুধুমাত্র ডিফল্ট ত্রুটি প্রতিক্রিয়াগুলির উপর নির্ভর করলে ক্লায়েন্টরা অস্পষ্ট বা সহায়ক নয় এমন তথ্য পেতে পারে। কাস্টম ব্যতিক্রম হ্যান্ডলারগুলি বেশ কয়েকটি সুবিধা প্রদান করে:
- উন্নত ব্যবহারকারীর অভিজ্ঞতা: নির্দিষ্ট ত্রুটির পরিস্থিতির জন্য তৈরি স্পষ্ট এবং তথ্যপূর্ণ ত্রুটির বার্তা সরবরাহ করুন।
- কেন্দ্রীয় ত্রুটি ব্যবস্থাপনা: আপনার কোডটিকে আরও রক্ষণাবেক্ষণযোগ্য করে তোলে, এক জায়গায় ত্রুটি হ্যান্ডলিং যুক্তি একত্র করুন।
- সামঞ্জস্যপূর্ণ ত্রুটি প্রতিক্রিয়া: নিশ্চিত করুন যে ত্রুটি প্রতিক্রিয়াগুলি একটি সামঞ্জস্যপূর্ণ বিন্যাস অনুসরণ করে, এপিআই ব্যবহারযোগ্যতা উন্নত করে।
- উন্নত নিরাপত্তা: ত্রুটির বার্তাগুলিতে সংবেদনশীল তথ্য প্রকাশ করা থেকে বিরত থাকুন।
- কাস্টম লগিং: ডিবাগিং এবং পর্যবেক্ষণের উদ্দেশ্যে বিস্তারিত ত্রুটির তথ্য লগ করুন।
ফাস্টএপিআই-এর ব্যতিক্রম হ্যান্ডলিং বোঝা
ফাস্টএপিআই ত্রুটিগুলি পরিচালনা করতে পাইথনের অন্তর্নির্মিত ব্যতিক্রম হ্যান্ডলিং প্রক্রিয়া এবং এর নিজস্ব নির্ভরতা ইনজেকশন সিস্টেমের সংমিশ্রণ ব্যবহার করে। যখন একটি রুটে বা নির্ভরতায় একটি ব্যতিক্রম উত্থাপিত হয়, তখন ফাস্টএপিআই এটি প্রক্রিয়া করার জন্য একটি উপযুক্ত ব্যতিক্রম হ্যান্ডলারের সন্ধান করে।
ব্যতিক্রম হ্যান্ডলারগুলি @app.exception_handler() দিয়ে সজ্জিত ফাংশন যা দুটি আর্গুমেন্ট গ্রহণ করে: ব্যতিক্রমের ধরণ এবং অনুরোধ অবজেক্ট। হ্যান্ডলার উপযুক্ত HTTP প্রতিক্রিয়া ফেরত দেওয়ার জন্য দায়ী।
কাস্টম ব্যতিক্রম তৈরি করা
কাস্টম ব্যতিক্রম হ্যান্ডলারগুলি সংজ্ঞায়িত করার আগে, আপনার অ্যাপ্লিকেশনে নির্দিষ্ট ত্রুটির পরিস্থিতিগুলির প্রতিনিধিত্বকারী কাস্টম ব্যতিক্রম ক্লাস তৈরি করা প্রায়শই উপকারী। এটি কোডের পাঠযোগ্যতা উন্নত করে এবং বিভিন্ন ধরণের ত্রুটিগুলি পরিচালনা করা সহজ করে তোলে।
উদাহরণস্বরূপ, ধরা যাক আপনি একটি ই-কমার্স এপিআই তৈরি করছেন এবং একটি পণ্যের স্টক শেষ হয়ে গেলে সেই পরিস্থিতিগুলি পরিচালনা করতে হবে। আপনি OutOfStockError নামে একটি কাস্টম ব্যতিক্রম ক্লাস সংজ্ঞায়িত করতে পারেন:
class OutOfStockError(Exception):
def __init__(self, product_id: int):
self.product_id = product_id
self.message = f"Product with ID {product_id} is out of stock."
এই কাস্টম ব্যতিক্রম ক্লাসটি বেস Exception ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত এবং একটি product_id অ্যাট্রিবিউট এবং একটি কাস্টম ত্রুটির বার্তা অন্তর্ভুক্ত করে।
কাস্টম ব্যতিক্রম হ্যান্ডলার বাস্তবায়ন
এখন, OutOfStockError এর জন্য একটি কাস্টম ব্যতিক্রম হ্যান্ডলার তৈরি করা যাক। এই হ্যান্ডলারটি ব্যতিক্রমটি ধরবে এবং ত্রুটির বার্তা সহ একটি JSON বডি সহ একটি HTTP 400 (Bad Request) প্রতিক্রিয়া ফেরত দেবে।
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import JSONResponse
app = FastAPI()
class OutOfStockError(Exception):
def __init__(self, product_id: int):
self.product_id = product_id
self.message = f"Product with ID {product_id} is out of stock."
@app.exception_handler(OutOfStockError)
async def out_of_stock_exception_handler(request: Request, exc: OutOfStockError):
return JSONResponse(
status_code=400,
content={"message": exc.message},
)
@app.get("/products/{product_id}")
async def get_product(product_id: int):
# Simulate checking product stock
if product_id == 123:
raise OutOfStockError(product_id=product_id)
return {"product_id": product_id, "name": "Example Product", "price": 29.99}
এই উদাহরণে, @app.exception_handler(OutOfStockError) ডেকোরেটর out_of_stock_exception_handler ফাংশনটিকে OutOfStockError ব্যতিক্রমগুলি পরিচালনা করার জন্য নিবন্ধিত করে। যখন get_product রুটে OutOfStockError উত্থাপিত হয়, তখন ব্যতিক্রম হ্যান্ডলারটি ডাকা হয়। হ্যান্ডলারটি তখন 400 এর স্ট্যাটাস কোড এবং ত্রুটির বার্তা সহ একটি JSON বডি সহ একটি JSONResponse ফেরত দেয়।
একাধিক ব্যতিক্রম প্রকার পরিচালনা করা
আপনি বিভিন্ন ধরণের ব্যতিক্রম পরিচালনা করার জন্য একাধিক ব্যতিক্রম হ্যান্ডলার সংজ্ঞায়িত করতে পারেন। উদাহরণস্বরূপ, আপনি ব্যবহারকারীর ইনপুট পার্স করার সময় ঘটতে পারে এমন ValueError ব্যতিক্রমগুলি পরিচালনা করতে চাইতে পারেন।
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
app = FastAPI()
@app.exception_handler(ValueError)
async def value_error_exception_handler(request: Request, exc: ValueError):
return JSONResponse(
status_code=400,
content={"message": str(exc)},
)
@app.get("/items/{item_id}")
async def get_item(item_id: int):
# Simulate invalid item_id
if item_id < 0:
raise ValueError("Item ID must be a positive integer.")
return {"item_id": item_id, "name": "Example Item"}
এই উদাহরণে, value_error_exception_handler ফাংশনটি ValueError ব্যতিক্রমগুলি পরিচালনা করে। এটি ব্যতিক্রম অবজেক্ট থেকে ত্রুটির বার্তাটি বের করে এবং JSON প্রতিক্রিয়াতে ফেরত দেয়।
HTTPException ব্যবহার করা
ফাস্টএপিআই HTTPException নামে একটি অন্তর্নির্মিত ব্যতিক্রম ক্লাস সরবরাহ করে যা HTTP-নির্দিষ্ট ত্রুটি উত্থাপন করতে ব্যবহার করা যেতে পারে। এটি অননুমোদিত অ্যাক্সেস বা রিসোর্স খুঁজে না পাওয়ার মতো সাধারণ ত্রুটির পরিস্থিতিগুলি পরিচালনা করার জন্য দরকারী হতে পারে।
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/users/{user_id}")
async def get_user(user_id: int):
# Simulate user not found
if user_id == 999:
raise HTTPException(status_code=404, detail="User not found")
return {"user_id": user_id, "name": "Example User"}
এই উদাহরণে, HTTPException একটি 404 (Not Found) স্ট্যাটাস কোড এবং একটি ডিটেইল মেসেজ সহ উত্থাপিত হয়। ফাস্টএপিআই স্বয়ংক্রিয়ভাবে HTTPException ব্যতিক্রমগুলি পরিচালনা করে এবং নির্দিষ্ট স্ট্যাটাস কোড এবং ডিটেইল মেসেজ সহ একটি JSON প্রতিক্রিয়া ফেরত দেয়।
গ্লোবাল ব্যতিক্রম হ্যান্ডলার
আপনি গ্লোবাল ব্যতিক্রম হ্যান্ডলারও সংজ্ঞায়িত করতে পারেন যা সমস্ত অ-হ্যান্ডেল করা ব্যতিক্রমগুলি ধরে। এটি ত্রুটিগুলি লগ করার জন্য বা ক্লায়েন্টকে একটি সাধারণ ত্রুটির বার্তা ফেরত দেওয়ার জন্য দরকারী হতে পারে।
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import logging
app = FastAPI()
logger = logging.getLogger(__name__)
@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
logger.exception(f"Unhandled exception: {exc}")
return JSONResponse(
status_code=500,
content={"message": "Internal server error"},
)
@app.get("/error")
async def trigger_error():
raise ValueError("This is a test error.")
এই উদাহরণে, global_exception_handler ফাংশনটি অন্য কোনও ব্যতিক্রম হ্যান্ডলার দ্বারা হ্যান্ডেল না করা সমস্ত ব্যতিক্রম পরিচালনা করে। এটি ত্রুটি লগ করে এবং একটি জেনেরিক ত্রুটির বার্তা সহ একটি 500 (Internal Server Error) প্রতিক্রিয়া ফেরত দেয়।
ব্যতিক্রম হ্যান্ডলিংয়ের জন্য মিডলওয়্যার ব্যবহার করা
ব্যতিক্রম হ্যান্ডলিংয়ের আরেকটি পদ্ধতি হল মিডলওয়্যার ব্যবহার করা। মিডলওয়্যার ফাংশনগুলি প্রতিটি অনুরোধের আগে এবং পরে কার্যকর হয়, যা আপনাকে উচ্চতর স্তরে ব্যতিক্রমগুলি আটকাতে এবং পরিচালনা করতে দেয়। এটি অনুরোধ এবং প্রতিক্রিয়া লগিং, বা কাস্টম প্রমাণীকরণ বা অনুমোদন যুক্তি বাস্তবায়নের মতো কাজের জন্য দরকারী হতে পারে।
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import logging
app = FastAPI()
logger = logging.getLogger(__name__)
@app.middleware("http")
async def exception_middleware(request: Request, call_next):
try:
response = await call_next(request)
except Exception as exc:
logger.exception(f"Unhandled exception: {exc}")
return JSONResponse(
status_code=500,
content={"message": "Internal server error"},
)
return response
@app.get("/error")
async def trigger_error():
raise ValueError("This is a test error.")
এই উদাহরণে, exception_middleware ফাংশনটি try...except ব্লকে অনুরোধ প্রক্রিয়াকরণ যুক্তিকে মোড়ানো করে। যদি অনুরোধ প্রক্রিয়াকরণের সময় কোনও ব্যতিক্রম উত্থাপিত হয়, তবে মিডলওয়্যারটি ত্রুটি লগ করে এবং একটি 500 (Internal Server Error) প্রতিক্রিয়া ফেরত দেয়।
উদাহরণ: আন্তর্জাতিকীকরণ (i18n) এবং ত্রুটির বার্তা
একটি বিশ্বব্যাপী দর্শকদের জন্য এপিআই তৈরি করার সময়, আপনার ত্রুটির বার্তাগুলি আন্তর্জাতিকীকরণের কথা বিবেচনা করুন। এর মধ্যে ব্যবহারকারীর স্থানীয়তার উপর ভিত্তি করে বিভিন্ন ভাষায় ত্রুটির বার্তা সরবরাহ করা জড়িত। সম্পূর্ণ i18n বাস্তবায়ন এই নিবন্ধের সুযোগের বাইরে হলেও, এখানে ধারণা প্রদর্শনের জন্য একটি সরলীকৃত উদাহরণ রয়েছে:
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import JSONResponse
from typing import Dict
app = FastAPI()
# Mock translation dictionary (replace with a real i18n library)
translations: Dict[str, Dict[str, str]] = {
"en": {
"product_not_found": "Product with ID {product_id} not found.",
"invalid_input": "Invalid input: {error_message}",
},
"fr": {
"product_not_found": "Produit avec l'ID {product_id} introuvable.",
"invalid_input": "Entrée invalide : {error_message}",
},
"es": {
"product_not_found": "Producto con ID {product_id} no encontrado.",
"invalid_input": "Entrada inválida: {error_message}",
},
"de": {
"product_not_found": "Produkt mit ID {product_id} nicht gefunden.",
"invalid_input": "Ungültige Eingabe: {error_message}",
}
}
def get_translation(locale: str, key: str, **kwargs) -> str:
"""Retrieves a translation for a given locale and key.
If the locale or key is not found, returns a default message.
"""
if locale in translations and key in translations[locale]:
return translations[locale][key].format(**kwargs)
return f"Translation missing for key '{key}' in locale '{locale}'."
@app.get("/products/{product_id}")
async def get_product(request: Request, product_id: int, locale: str = "en"):
# Simulate product lookup
if product_id > 100:
message = get_translation(locale, "product_not_found", product_id=product_id)
raise HTTPException(status_code=404, detail=message)
if product_id < 0:
message = get_translation(locale, "invalid_input", error_message="Product ID must be positive")
raise HTTPException(status_code=400, detail=message)
return {"product_id": product_id, "name": "Example Product"}
i18n উদাহরণের জন্য মূল উন্নতি:
- স্থানীয় প্যারামিটার: রুটটি এখন একটি
localeকোয়েরি প্যারামিটার গ্রহণ করে, যা ক্লায়েন্টদের তাদের পছন্দের ভাষা নির্দিষ্ট করতে দেয় (ডিফল্টরূপে "en" ইংরেজির জন্য)। - অনুবাদ অভিধান: একটি
translationsঅভিধান (মক) বিভিন্ন স্থানীয় (এই ক্ষেত্রে ইংরেজি, ফরাসি, স্প্যানিশ, জার্মান) জন্য ত্রুটির বার্তা সঞ্চয় করে। একটি বাস্তব অ্যাপ্লিকেশনে, আপনি একটি ডেডিকেটেড i18n লাইব্রেরি ব্যবহার করবেন। get_translationফাংশন: এই সহায়ক ফাংশনটিlocaleএবংkeyএর উপর ভিত্তি করে উপযুক্ত অনুবাদ পুনরুদ্ধার করে। এটি ডায়নামিক মানগুলি (যেমনproduct_id) সন্নিবেশ করার জন্য স্ট্রিং ফরম্যাটিংও সমর্থন করে।- ডায়নামিক ত্রুটির বার্তা:
HTTPExceptionএখনget_translationফাংশন ব্যবহার করে ডায়নামিকভাবে তৈরি করাdetailবার্তা সহ উত্থাপিত হয়।
যখন কোনও ক্লায়েন্ট /products/101?locale=fr অনুরোধ করে, তখন তারা ফরাসি ভাষায় একটি ত্রুটির বার্তা পাবে (যদি অনুবাদ উপলব্ধ থাকে)। যখন /products/-1?locale=es অনুরোধ করে, তখন তারা স্প্যানিশ ভাষায় নেতিবাচক আইডির বিষয়ে একটি ত্রুটির বার্তা পাবে (যদি উপলব্ধ থাকে)।
যখন /products/200?locale=xx (কোনও অনুবাদ নেই এমন একটি স্থানীয়) অনুরোধ করা হবে, তখন তারা `Translation missing` বার্তা পাবে।
ত্রুটি হ্যান্ডলিংয়ের জন্য সেরা অনুশীলন
ফাস্টএপিআই-তে ত্রুটি হ্যান্ডলিং প্রয়োগ করার সময় মনে রাখার জন্য এখানে কিছু সেরা অনুশীলন রয়েছে:
- কাস্টম ব্যতিক্রম ব্যবহার করুন: আপনার অ্যাপ্লিকেশনে নির্দিষ্ট ত্রুটির পরিস্থিতিগুলির প্রতিনিধিত্ব করার জন্য কাস্টম ব্যতিক্রম ক্লাস সংজ্ঞায়িত করুন।
- তথ্যপূর্ণ ত্রুটির বার্তা সরবরাহ করুন: স্পষ্ট এবং সংক্ষিপ্ত ত্রুটির বার্তাগুলি অন্তর্ভুক্ত করুন যা ক্লায়েন্টদের ত্রুটির কারণ বুঝতে সাহায্য করে।
- উপযুক্ত HTTP স্ট্যাটাস কোড ব্যবহার করুন: ত্রুটির প্রকৃতিকে সঠিকভাবে প্রতিফলিত করে এমন HTTP স্ট্যাটাস কোডগুলি ফেরত দিন। উদাহরণস্বরূপ, অবৈধ ইনপুটের জন্য 400 (Bad Request), অনুপস্থিত রিসোর্সের জন্য 404 (Not Found), এবং অপ্রত্যাশিত ত্রুটির জন্য 500 (Internal Server Error) ব্যবহার করুন।
- সংবেদনশীল তথ্য প্রকাশ করা এড়িয়ে চলুন: ত্রুটির বার্তাগুলিতে ডাটাবেস শংসাপত্র বা এপিআই কীগুলির মতো সংবেদনশীল তথ্য প্রকাশ করা থেকে সতর্ক থাকুন।
- ত্রুটিগুলি লগ করুন: ডিবাগিং এবং পর্যবেক্ষণের উদ্দেশ্যে বিস্তারিত ত্রুটির তথ্য লগ করুন। পাইথনের অন্তর্নির্মিত
loggingমডিউলের মতো একটি লগিং লাইব্রেরি ব্যবহার করুন। - ত্রুটি হ্যান্ডলিং যুক্তি কেন্দ্রীভূত করুন: কাস্টম ব্যতিক্রম হ্যান্ডলার বা মিডলওয়্যারের মতো এক জায়গায় ত্রুটি হ্যান্ডলিং যুক্তি একত্র করুন।
- আপনার ত্রুটি হ্যান্ডলিং পরীক্ষা করুন: আপনার ত্রুটি হ্যান্ডলিং যুক্তি সঠিকভাবে কাজ করছে তা নিশ্চিত করার জন্য ইউনিট পরীক্ষা লিখুন।
- একটি ডেডিকেটেড ত্রুটি ট্র্যাকিং পরিষেবা ব্যবহার করার কথা বিবেচনা করুন: প্রোডাকশন পরিবেশের জন্য, Sentry বা Rollbar এর মতো একটি ডেডিকেটেড ত্রুটি ট্র্যাকিং পরিষেবা ব্যবহার করার কথা বিবেচনা করুন যাতে ত্রুটিগুলি পর্যবেক্ষণ এবং বিশ্লেষণ করা যায়। এই সরঞ্জামগুলি আপনার অ্যাপ্লিকেশনের স্বাস্থ্যের বিষয়ে মূল্যবান অন্তর্দৃষ্টি সরবরাহ করতে পারে এবং আপনাকে সমস্যাগুলি দ্রুত সনাক্ত করতে এবং সমাধান করতে সহায়তা করতে পারে।
উপসংহার
কাস্টম ব্যতিক্রম হ্যান্ডলারগুলি ফাস্টএপিআই-এ শক্তিশালী এবং ব্যবহারকারী-বান্ধব এপিআই তৈরির জন্য একটি শক্তিশালী সরঞ্জাম। কাস্টম ব্যতিক্রম ক্লাস এবং হ্যান্ডলার সংজ্ঞায়িত করে, আপনি ত্রুটিগুলি সুন্দরভাবে পরিচালনা করতে পারেন, ক্লায়েন্টদের তথ্যপূর্ণ প্রতিক্রিয়া সরবরাহ করতে পারেন এবং আপনার অ্যাপ্লিকেশনের সামগ্রিক নির্ভরযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করতে পারেন। কাস্টম ব্যতিক্রম, HTTPExceptions, এবং প্রযোজ্য i18n নীতিগুলি ব্যবহার করে, আপনার API বিশ্বব্যাপী সাফল্যের জন্য প্রস্তুত হয়।
আপনার ত্রুটি হ্যান্ডলিং কৌশল ডিজাইন করার সময় ব্যবহারকারীর অভিজ্ঞতার কথা মনে রাখবেন। স্পষ্ট এবং সংক্ষিপ্ত ত্রুটির বার্তাগুলি সরবরাহ করুন যা ব্যবহারকারীদের সমস্যাটি বুঝতে এবং এটি কীভাবে সমাধান করা যায় তা বুঝতে সাহায্য করে। কার্যকর ত্রুটি হ্যান্ডলিং হল উচ্চ-মানের এপিআই তৈরির একটি ভিত্তি যা একটি বৈচিত্র্যময় বিশ্বব্যাপী দর্শকদের চাহিদা পূরণ করে।