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"
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