2025, Oct 16 00:32

Flask में /api के साथ सभी एंडपॉइंट्स को प्रीफ़िक्स करने का सही तरीका

Flask में APPLICATION_ROOT या SCRIPT_NAME पर भरोसा किए बिना सभी एंडपॉइंट्स को /api के तहत रखें: blueprint के url_prefix या प्रीफ़िक्स से 404 से बचें आसानी से.

रूट्स को तोड़े बिना /api के साथ सभी Flask एंडपॉइंट्स को कैसे प्रीफ़िक्स करें

/api जैसे किसी सामान्य पाथ के तहत हर एंडपॉइंट रखना एक आम ज़रूरत है। स्वाभाविक रूप से मन करता है कि APPLICATION_ROOT या SCRIPT_NAME जैसी कॉन्फ़िगरेशन कुंजियों का सहारा लें और उम्मीद करें कि Flask अपने‑आप प्रीफ़िक्स जोड़ देगा। व्यवहार में, यह तरीका /api/... कॉल करने पर 404 तक पहुंचा देता है—जब तक आप हर रूट में प्रीफ़िक्स हार्डकोड न करें या उसे ब्लूप्रिंट पर साफ़ तौर पर सेट न करें।

वह सेटअप जो 404 तक ले जाता है

नीचे एक न्यूनतम संरचना है जो पहली नज़र में सही लगती है, लेकिन /api/... पर 404 देती है, क्योंकि रूट्स /api के नीचे जाने के बजाय एप्लिकेशन रूट / पर ही बने रहते हैं।

# core.py
from flask import Flask
site = Flask(__name__)
# हर चीज़ को /api के तहत माउंट करने की कोशिश
site.config["SCRIPT_NAME"] = "/api/"
# वैकल्पिक:
# site.config["APPLICATION_ROOT"] = "/api/"
# modules/accounts.py
from flask import Blueprint
acct_bp = Blueprint("accounts_bp", __name__)
@acct_bp.route("/", methods=["GET"])
def fetch_root():
    return "Called get method"
@acct_bp.route("/data", methods=["GET"])
def fetch_data():
    return "Called data method"
# main.py
from core import site
from modules.accounts import acct_bp
site.register_blueprint(acct_bp)
if __name__ == "__main__":
    site.run(debug=True)

अब /api/ कॉल करने पर 404 मिलता है। रूट्स मौजूद हैं, लेकिन वे एप्लिकेशन रूट पर / और /data से बंधे हैं, /api के नीचे नहीं।

ऐसा क्यों होता है

APPLICATION_ROOT और SCRIPT_NAME उस बेस पाथ को परिभाषित करते हैं जहाँ WSGI सर्वर आपका एप्लिकेशन माउंट करता है। वे डेवलपमेंट के दौरान आपके रूट्स में /api अपने‑आप नहीं जोड़ते, इसलिए @...route("/") अंत में / पर ही बनता है, /api/ पर नहीं। यही असंगति /api/... पर किए गए अनुरोधों के 404 लौटाने का कारण है।

समाधान: blueprint पर या पंजीकरण के समय url_prefix का उपयोग करें

किसी समूह के रूट्स को एक साझा पाथ के नीचे लाने का सही तरीका url_prefix है। इसे आप blueprint बनाते समय सेट कर सकते हैं, या फिर उसे रजिस्टर करते वक्त। दोनों से समान व्यवहार मिलता है।

विकल्प A: prefix सीधे blueprint पर सेट करें।

# core.py
from flask import Flask
site = Flask(__name__)
# modules/accounts.py
from flask import Blueprint
acct_bp = Blueprint("accounts_bp", __name__, url_prefix="/api")
@acct_bp.route("/", methods=["GET"])
def fetch_root():
    return "Called get method"
@acct_bp.route("/data", methods=["GET"])
def fetch_data():
    return "Called data method"
# main.py
from core import site
from modules.accounts import acct_bp
site.register_blueprint(acct_bp)
if __name__ == "__main__":
    site.run(debug=True)
python main.py
>> curl http://127.0.0.1:5000/api/
Called get method
>> curl http://127.0.0.1:5000/api/data
Called data method

विकल्प B: blueprint को साफ रखें और prefix पंजीकरण के समय लगाएँ।

# core.py
from flask import Flask
site = Flask(__name__)
# modules/accounts.py
from flask import Blueprint
acct_bp = Blueprint("accounts_bp", __name__)
@acct_bp.route("/", methods=["GET"])
def fetch_root():
    return "Called get method"
@acct_bp.route("/data", methods=["GET"])
def fetch_data():
    return "Called data method"
# main.py
from core import site
from modules.accounts import acct_bp
site.register_blueprint(acct_bp, url_prefix="/api")
if __name__ == "__main__":
    site.run(debug=True)
python main.py
>> curl http://127.0.0.1:5000/api/
Called get method
>> curl http://127.0.0.1:5000/api/data
Called data method

यह जानना क्यों उपयोगी है

डेवलपमेंट में URL मैप को बदलने के लिए APPLICATION_ROOT या SCRIPT_NAME पर भरोसा करने से उलझन भरे 404 मिलते हैं और वास्तविक समस्या छिप जाती है। समझ लें कि ये कुंजियाँ बताती हैं ऐप कहाँ माउंट है—वे रूट्स को फिर से नहीं लिखतीं। url_prefix का उपयोग रूटिंग को स्पष्ट, अनुमानित और मॉड्यूल्स में एकरस बनाता है।

निष्कर्ष

यदि आपको हर एंडपॉइंट को /api के तहत रखना है, तो url_prefix को प्राथमिकता दें। इसे या तो blueprint पर सेट करें या रजिस्ट्रेशन के समय, और डेवलपमेंट में रूट प्रीफ़िक्सिंग के लिए APPLICATION_ROOT या SCRIPT_NAME पर निर्भर होने से बचें। इससे आपकी रूटिंग संरचना पारदर्शी रहती है और /api/ एंडपॉइंट्स पर जाते समय अप्रत्याशित 404 से बचाव होता है।

यह लेख StackOverflow पर प्रश्न (द्वारा Mr.Singh) और Ajeet Verma के उत्तर पर आधारित है।