Split Python Flask app into multiple files Split Python Flask app into multiple files python python

Split Python Flask app into multiple files


Yes, Blueprints are the right way to do it. What you are trying to do can be achieved like this:

Main.py

from flask import Flaskfrom AccountAPI import account_apiapp = Flask(__name__)app.register_blueprint(account_api)@app.route("/")def hello():    return "Hello World!"if __name__ == "__main__":    app.run()

AccountAPI.py

from flask import Blueprintaccount_api = Blueprint('account_api', __name__)@account_api.route("/account")def accountList():    return "list of accounts"

If this is an option, you might consider using different URL prefixes for the different APIs/Blueprints in order to cleanly separate them. This can be done with a slight modification to the above register_blueprint call:

app.register_blueprint(account_api, url_prefix='/accounts')

For further documentation, you may also have a look at the official docs.


Using Blueprint you can add your routes in the routes directory.

Structure

app.pyroutes    __init__.py    index.py    users.py

__init__.py

from flask import Blueprintroutes = Blueprint('routes', __name__)from .index import *from .users import *

index.py

from flask import render_templatefrom . import routes@routes.route('/')def index():    return render_template('index.html')

users.py

from flask import render_templatefrom . import routes@routes.route('/users')def users():    return render_template('users.html')

app.py

from routes import *app.register_blueprint(routes)

If you want to add a new route file, say accounts.py, you just need to create the file accounts.py in the routes directory, just like index.py and users.py, then import it in the routes.__init__.py file

from .accounts import *


If you are using blueprints and want to route / redirect to a url of your blueprint inside a template you are using you need to use the correct url_for statement.

In your case if you would like to open the url account of your blueprint you have to state it like this in your template:

href="{{ url_for('account_api.account') }}"

and for the main app it would look like this:

redirect(url_for('account_api.account'))

Otherwise the werkzeug library will throw an error.