Split Python Flask app into multiple files
Solution 1
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 Flask
from AccountAPI import account_api
app = Flask(__name__)
app.register_blueprint(account_api)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
AccountAPI.py
from flask import Blueprint
account_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.
Solution 2
Using Blueprint
you can add your routes in the routes
directory.
Structure
app.py
routes
__init__.py
index.py
users.py
__init__.py
from flask import Blueprint
routes = Blueprint('routes', __name__)
from .index import *
from .users import *
index.py
from flask import render_template
from . import routes
@routes.route('/')
def index():
return render_template('index.html')
users.py
from flask import render_template
from . 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 *
Solution 3
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.
Solution 4
One another way to do this can be with lazy loading, where you would explicitly attach view functions on need basis.
Related videos on Youtube
user1751547
Updated on May 31, 2020Comments
-
user1751547 almost 4 years
I'm having trouble understanding how to split a flask app into multiple files.
I'm creating a web service and I want to split the api's into different files (AccountAPI.py, UploadAPI.py, ...), just so I don't have one huge python file.
I've read that you can do this with Blueprints, but I'm not entirely sure that route is the right one for me.
Ultimately I want to run one Main python file and include other files so that when it runs, they are considered one big file.
For example if I have Main.py and AccountAPI.py I want to be able to do this:
Main.py:
from flask import Flask import AccountAPI app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
AccountAPI.py:
@app.route("/account") def accountList(): return "list of accounts"
I know with this example it obviously won't work, but is it possible to do something like that?
Thanks
-
user1751547 about 11 yearsThis worked perfectly for me thanks! I guess I should have read the Blueprint docs more carefeully.
-
jeyraof over 10 yearsHey, I have a question. In following above code, does url for accountList() be matched 'domain/accounts/account'?
-
matchifang over 7 yearsCan Main.py and AccountAPI.py have a shared global variable that is in either of the files?
-
Abhishek J almost 7 yearsIt's throwing an Import Error
-
GA1 almost 7 yearsIs there a simple solution for putting
accountList
inside a class in the same file? -
TomSawyer over 6 yearsImporting in middle of the file can be considered as bad practice?
-
Ashok Sri almost 5 yearsWorked like a charm, further how to add protected end point by using JWT in separate .py files
-
cyroxx almost 5 years@AshokSri This goes beyond the scope of the question. I would recommend to search for a good tutorial on Flask and JWT.