Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add prefix to all URLs while using Blueprint

I am trying to prefix all endpoints with /api/, but I am getting 404 in return if not providing directly in the URL or while registering blueprint.

main.py

from init import app

from modules.User import User

app.register_blueprint(User)

if __name__ == "__main__":
    app.run(debug=True)

init.py

from flask import Flask

# initiating application instance
app = Flask(__name__)

# app configurations
app.config["SCRIPT_NAME"] = "/api/"

# -- OR --

app.config["APPLICATION_ROOT"] = "/api/"
...

modules/User.py

from flask import request, Blueprint

User = Blueprint("user_blueprint", __name__)

# if "/api/" is provided directly 
@User.route("/api/", methods=["GET"]) 
def get():
    return "Called get method"


# 404 if "/" is provided
@User.route("/", methods=["GET"]) 
def get():
    return "Called get method"
like image 347
MrSingh Avatar asked Sep 07 '25 15:09

MrSingh


1 Answers

APPLICATION_ROOT and SCRIPT_NAME define the base path where the application is mounted by the WSGI server.

They don’t automatically add /api to your routes during development, so your @User.route("/") ends up at /, not /api/, hence you get the 404.

You can achieve the desired behavior in one of the following ways:

  • use url_prefix on the blueprint

    Use:

    # modules/User.py
    User = Blueprint("user_blueprint", __name__, url_prefix="/api")
    

    Instead of:

    # modules/User.py
    User = Blueprint("user_blueprint", __name__)
    

    Code:

    # main.py
    from init import app
    from modules.User import User
    
    app.register_blueprint(User)
    
    
    if __name__ == "__main__":
        app.run(debug=True)
    
    # init.py
    from flask import Flask
    
    # initiating application instance
    app = Flask(__name__)
    
    # modules/User.py
    from flask import request, Blueprint
    
    User = Blueprint("user_blueprint", __name__, url_prefix="/api")
    
    @User.route("/", methods=["GET"])
    def get():
        return "Called get method"
    
    @User.route("/data", methods=["GET"])
    def data():
        return "Called data method"
    
    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
    
  • or use url_prefix when registering it

    Use:

    # main.py
    app.register_blueprint(User, url_prefix="/api")
    

    Instead of:

    # main.py
    app.register_blueprint(User)
    

    Code:

    # main.py
    from init import app
    from modules.User import User
    
    app.register_blueprint(User, url_prefix="/api")
    
    
    if __name__ == "__main__":
        app.run(debug=True)
    
    # init.py
    from flask import Flask
    
    # initiating application instance
    app = Flask(__name__)
    
    # modules/User.py
    from flask import Blueprint
    
    User = Blueprint("user_blueprint", __name__)
    
    @User.route("/", methods=["GET"])
    def get():
        return "Called get method"
    
    @User.route("/data", methods=["GET"])
    def data():
        return "Called data method"
    
    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
    
like image 165
Ajeet Verma Avatar answered Sep 10 '25 08:09

Ajeet Verma