विषय पर बढ़ें

Middleware

🌐 एआई और मनुष्यों द्वारा किया गया अनुवाद

यह अनुवाद मनुष्यों के मार्गदर्शन में एआई द्वारा किया गया है। 🤝

इसमें मूल अर्थ को गलत समझने या अप्राकृतिक लगने आदि जैसी गलतियाँ हो सकती हैं। 🤖

आप हमें एआई LLM को बेहतर मार्गदर्शन करने में मदद करके इस अनुवाद को बेहतर बना सकते हैं।

अंग्रेज़ी संस्करण

आप FastAPI applications में middleware जोड़ सकते हैं।

"middleware" एक function है जो हर request के साथ काम करता है, इससे पहले कि उसे किसी विशेष path operation द्वारा process किया जाए। और हर response के साथ भी, उसे लौटाने से पहले।

  • यह आपके application में आने वाली हर request लेता है।
  • फिर यह उस request के साथ कुछ कर सकता है या कोई required code चला सकता है।
  • फिर यह request को application के बाकी हिस्से द्वारा process होने के लिए आगे भेजता है (किसी path operation द्वारा)।
  • फिर यह application द्वारा generate किया गया response लेता है (किसी path operation द्वारा)।
  • यह उस response के साथ कुछ कर सकता है या कोई required code चला सकता है।
  • फिर यह response लौटाता है।

तकनीकी विवरण

अगर आपके पास yield वाली dependencies हैं, तो exit code middleware के बाद चलेगा।

अगर कोई background tasks थे (Background Tasks section में कवर किया गया है, आप इसे बाद में देखेंगे), तो वे सभी middleware के बाद चलेंगे।

Middleware बनाएं

middleware बनाने के लिए आप किसी function के ऊपर decorator @app.middleware("http") का उपयोग करते हैं।

middleware function को मिलता है:

  • request
  • एक function call_next जो request को parameter के रूप में प्राप्त करेगा।
    • यह function request को संबंधित path operation तक पास करेगा।
    • फिर यह संबंधित path operation द्वारा generate किया गया response लौटाता है।
  • फिर आप response लौटाने से पहले उसे और modify कर सकते हैं।
import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.perf_counter()
    response = await call_next(request)
    process_time = time.perf_counter() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

सुझाव

ध्यान रखें कि custom proprietary headers को X- prefix का उपयोग करके जोड़ा जा सकता है।

लेकिन अगर आपके पास custom headers हैं जिन्हें आप browser में client को दिखाना चाहते हैं, तो आपको उन्हें अपने CORS configurations (CORS (Cross-Origin Resource Sharing)) में expose_headers parameter का उपयोग करके जोड़ना होगा, जैसा कि Starlette के CORS docs में documented है।

तकनीकी विवरण

आप from starlette.requests import Request भी उपयोग कर सकते हैं।

FastAPI इसे आपके लिए, developer की सुविधा के रूप में provide करता है। लेकिन यह सीधे Starlette से आता है।

response से पहले और बाद में

आप request के साथ चलाने के लिए code जोड़ सकते हैं, इससे पहले कि कोई path operation उसे प्राप्त करे।

और response generate होने के बाद भी, उसे लौटाने से पहले।

उदाहरण के लिए, आप एक custom header X-Process-Time जोड़ सकते हैं जिसमें seconds में वह time हो जो request को process करने और response generate करने में लगा:

import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.perf_counter()
    response = await call_next(request)
    process_time = time.perf_counter() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

सुझाव

यहाँ हम time.time() के बजाय time.perf_counter() का उपयोग करते हैं क्योंकि यह इन use cases के लिए अधिक precise हो सकता है। 🤓

कई middleware का execution order

जब आप @app.middleware() decorator या app.add_middleware() method का उपयोग करके कई middleware जोड़ते हैं, तो हर नया middleware application को wrap करता है, जिससे एक stack बनता है। जो middleware अंत में जोड़ा जाता है वह outermost होता है, और पहला innermost होता है।

request path पर, outermost middleware पहले चलता है।

response path पर, यह अंत में चलता है।

उदाहरण के लिए:

app.add_middleware(MiddlewareA)
app.add_middleware(MiddlewareB)

इससे execution order यह होता है:

  • Request: MiddlewareB → MiddlewareA → route

  • Response: route → MiddlewareA → MiddlewareB

यह stacking behavior सुनिश्चित करता है कि middleware एक predictable और controllable order में execute हों।

अन्य middleware

आप बाद में Advanced User Guide: Advanced Middleware में अन्य middleware के बारे में और पढ़ सकते हैं।

आप अगले section में middleware के साथ CORS को handle करने के बारे में पढ़ेंगे।