Why this post?
Because I could not find any resource that tells me how to deploy a Flask app to Heroku through the Heroku web interface. Through the web interface, not through the CLI 😒
Also because the official Heroku starter pack for Flask has way too many files; it intimidated me no end. Are so many files really needed, I asked myself 😓 And the Heroku documentation for that starter pack (and the documentation otherwise) assumes a level of knowledge that I do not have.
Also because the Flask app that ran perfectly on my laptop would not work on Heroku and none of the resources Google threw at me could tell me how to solve it. I wanted something beyond the hello world apps, something that took in a user input and returned a result. I went on to the 5th and 6th page of the search results, looking... 😞 Why isn't this part clearly documented anywhere, I asked myself.
So, this post.
This post is for people like me, people who are just learning to code, are not professional coders, and will not use the CLI until you make them an offer they can't refuse.
This post is for people who want minimal stuff on their laptops, and prefer to do things on the cloud through graphical user interfaces. UIs for the win 🎉
This post assumes you know the basics of Python (and Flask). That you already know how to get a Hello world
app in Flask running on your local machine.
TL;DR
(i) In your Flask code, replace
app.run()
with host and port instructions.
(ii) In your repo, have a pip file topip install
the required packages at the Heroku end.
(iii) In your repo, also haveProcfile
andrequirements.txt
to specify a web server for the app.
What does the app do?
It takes a user input, processes it, and returns the results of that process. To do so, it uses the Flask framework of Python.
To test a Flask app locally, you use the app.run()
command. By default, Flask starts a web server on the local machine and uses port 5000 to deploy the app.
To run the app on Heroku, three additional steps are needed:
- Heroku does not have a web server for Flask, so you need to tell it how to start a web server. This app uses
gunicorn
as HTTP server. So, for the app to run on Heroku, it needs aProcfile
that contains the following command:web: gunicorn flaskStarter:app
whereweb
tells Heroku this is a web app,gunicorn
tells it to use that server for app deployment,flaskStarter
is the name of the Python program that contains the app code, andapp
is the name of the app routine inside the code. - Heroku needs to install
gunicorn
before it compiles the app, and you tell it to do so through a file calledPipfile
. - Then, you need to modify your Python file to include the host and port info for app deployment. You do so by replacing
app.run()
with the following lines of code:
port = int(os.environ.get("PORT", 5000))
app.run(host='0.0.0.0', port=port)
Both Procfile
and Pipfile
must be named exactly so, and not have any file extension.
That's it. Now the app, which ran so beautifully on the local machine, will also run on Heroku.
🚶 Armed with this knowledge, I'll now fine-tune an app that I am building around an API and deploy it to Heroku for the world to use ...
If you'd like to get started with Heroku, I created a GitHub repo for the files you'd need: flask-heroku-starter-pack. And, here's the Heroku app.
Top comments (0)