Custom Middleware তৈরি এবং কনফিগার করা

Web Development - ফাস্টএপিআই (FastAPI) - FastAPI এর Middleware এবং Custom Middleware তৈরি
161

FastAPI তে Middleware ব্যবহার করা হয় বিভিন্ন ধরনের টাস্ক যেমন লগিং, রিকোয়েস্ট এবং রেসপন্স মডিফিকেশন, সিকিউরিটি চেক ইত্যাদি করার জন্য। Custom Middleware তৈরি করা খুবই সহজ এবং এর মাধ্যমে আপনি FastAPI অ্যাপ্লিকেশনের কার্যক্ষমতা এবং নিরাপত্তা বাড়াতে পারেন।

এখানে, আমরা দেখব কিভাবে FastAPI-তে Custom Middleware তৈরি এবং কনফিগার করা যায়।


Middleware কী?

Middleware হল একটি ফাংশন বা ক্লাস যা HTTP রিকোয়েস্ট আসার আগে এবং HTTP রেসপন্স ফেরানোর পরে কার্যকর হয়। FastAPI তে Middleware ব্যবহারের মাধ্যমে আপনি রিকোয়েস্ট প্রসেসিংয়ের প্রক্রিয়া পরিবর্তন করতে বা অতিরিক্ত কাজ (যেমন লগিং, অথেনটিকেশন) করতে পারেন।

FastAPI তে Middleware সাধারণত দুটি পদ্ধতিতে কাজ করে:

  1. Before Request: রিকোয়েস্ট আসার আগে কিছু কার্যকলাপ সম্পাদন করা।
  2. After Response: রেসপন্স ফেরানোর আগে বা পরে কিছু কার্যকলাপ সম্পাদন করা।

Step 1: Custom Middleware তৈরি করা

Custom Middleware তৈরি করতে, FastAPI তে BaseHTTPMiddleware ক্লাস ব্যবহার করতে হয়, যা starlette.middleware.base থেকে আসে। এর মাধ্যমে আমরা dispatch মেথড ওভাররাইড করে Middleware তৈরি করতে পারি।

উদাহরণ: Simple Logging Middleware

from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
import time

class LoggingMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        start_time = time.time()
        response = await call_next(request)
        process_time = time.time() - start_time
        print(f"Request processed in {process_time} seconds")
        return response

app = FastAPI()

# Custom Middleware যোগ করা
app.add_middleware(LoggingMiddleware)

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

এখানে:

  • LoggingMiddleware একটি Custom Middleware যা রিকোয়েস্ট প্রোসেস করার সময় কতটা সময় লাগছে তা লগ করে।
  • call_next ব্যবহার করে রিকোয়েস্ট প্রসেস করার পরে রেসপন্সটি ফেরত দেওয়া হয়।
  • start_time এবং process_time ব্যবহার করে মোট প্রসেসিং সময় বের করা হচ্ছে।

রিকোয়েস্ট উদাহরণ:

GET /

রেসপন্স:

{
  "message": "Hello, World!"
}

লগ:

Request processed in 0.0003 seconds

Step 2: Request এবং Response Manipulation Middleware

Custom Middleware ব্যবহার করে আপনি Request এবং Response উভয়কে ম্যানিপুলেট করতে পারেন। উদাহরণস্বরূপ, আপনি রিকোয়েস্ট হেডার বা রেসপন্স কন্টেন্ট পরিবর্তন করতে পারেন।

উদাহরণ: Custom Header Add করা Middleware

from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import Response

class AddCustomHeaderMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        response: Response = await call_next(request)
        response.headers["X-Custom-Header"] = "This is a custom header"
        return response

app = FastAPI()

# Custom Middleware যোগ করা
app.add_middleware(AddCustomHeaderMiddleware)

@app.get("/")
def read_root():
    return {"message": "Custom header added!"}

এখানে:

  • AddCustomHeaderMiddleware একটি Middleware যা রেসপন্সে X-Custom-Header যোগ করে।
  • call_next রিকোয়েস্ট প্রসেস করার পর, রেসপন্সে কাস্টম হেডারটি যোগ করা হচ্ছে।

রিকোয়েস্ট উদাহরণ:

GET /

রেসপন্স:

{
  "message": "Custom header added!"
}

Response Header:

X-Custom-Header: This is a custom header

Step 3: Error Handling Middleware

Middleware ব্যবহার করে আপনি Error Handlingও করতে পারেন, যেমন রিকোয়েস্ট প্রোসেস করার সময় কোনো ত্রুটি হলে তা হ্যান্ডেল করা।

উদাহরণ: Custom Error Handling Middleware

from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import JSONResponse

class ErrorHandlingMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        try:
            response = await call_next(request)
            return response
        except Exception as e:
            return JSONResponse(
                status_code=500,
                content={"detail": f"An error occurred: {str(e)}"}
            )

app = FastAPI()

# Custom Middleware যোগ করা
app.add_middleware(ErrorHandlingMiddleware)

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

@app.get("/error")
def cause_error():
    raise Exception("Something went wrong!")

এখানে:

  • ErrorHandlingMiddleware একটি Custom Middleware যা যে কোনো ত্রুটি ধরবে এবং একটি কাস্টম JSON রেসপন্স ফেরত দেবে।

রিকোয়েস্ট উদাহরণ:

GET /error

রেসপন্স (ত্রুটি):

{
  "detail": "An error occurred: Something went wrong!"
}

Step 4: Dependency Injection Middleware

FastAPI তে Middleware ব্যবহার করে আপনি Dependency Injection করতে পারেন। উদাহরণস্বরূপ, আপনি একটি নির্দিষ্ট ডিপেনডেন্সি ইনজেক্ট করতে পারেন যা Middleware এর মধ্যে কাজ করবে।

উদাহরণ: Dependency Injection Middleware

from fastapi import FastAPI, Depends
from starlette.middleware.base import BaseHTTPMiddleware

class DependencyInjectionMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        # Dependency Injection: Adding a custom value to the request state
        request.state.custom_value = "Injected Value"
        response = await call_next(request)
        return response

app = FastAPI()

# Custom Middleware যোগ করা
app.add_middleware(DependencyInjectionMiddleware)

@app.get("/")
def read_root(request: Request):
    return {"message": f"Custom value: {request.state.custom_value}"}

এখানে:

  • request.state.custom_value ব্যবহার করে Middleware তে ডিপেনডেন্সি ইনজেক্ট করা হয়েছে এবং তা পরে রিকোয়েস্টে ব্যবহৃত হচ্ছে।

রিকোয়েস্ট উদাহরণ:

GET /

রেসপন্স:

{
  "message": "Custom value: Injected Value"
}

Step 5: Configuring Middleware Order

FastAPI তে আপনি Middleware Order কনফিগার করতে পারেন, অর্থাৎ কোন Middleware প্রথমে কার্যকর হবে এবং কোনটি পরে। Middleware এর কার্যক্রম নির্ধারণ করতে এটি গুরুত্বপূর্ণ হতে পারে।

from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware

class FirstMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        print("First Middleware")
        response = await call_next(request)
        return response

class SecondMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        print("Second Middleware")
        response = await call_next(request)
        return response

app = FastAPI()

# Middleware গুলি যোগ করা
app.add_middleware(FirstMiddleware)
app.add_middleware(SecondMiddleware)

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

এখানে, FirstMiddleware প্রথমে কার্যকর হবে, তারপর SecondMiddleware

রিকোয়েস্ট উদাহরণ:

GET /

কনসোল আউটপুট:

First Middleware
Second Middleware

FastAPI তে Custom Middleware তৈরি করা এবং কনফিগার করা খুবই সহজ। Middleware ব্যবহার করে আপনি বিভিন্ন ধরনের কাজ করতে পারেন, যেমন লগিং, রিকোয়েস্ট এবং রেসপন্স মডিফিকেশন, সিকিউরিটি চেক ইত্যাদি। Middleware ব্যবস্থাপনা ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনের কার্যক্ষমতা, নিরাপত্তা এবং মান উন্নত করতে পারেন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...