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"
1 Answer 1
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_prefixon the blueprintUse:
# 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 methodor use
url_prefixwhen registering itUse:
# 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
url_prefixattribute for the blueprint instead of assigning a custom prefix for each route? This can be done when initializing or registering the blueprint..envand they take effect throughout the application which is quite easy.