Skip to main content

Python - Deploying a Web App with Flask

Sham Sui Po, Hong Kong

Github Repository

Setup​

Flask is a lightweight WSGI web application framework. It is designed to make getting started quick and easy, with the ability to scale up to complex applications.

pip install flask

Hello World​

Flask expects you to put your HTML pages inside a folder templates. Add a simple index.html page and outside of this folder add a main.py:

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/')

def home():
return render_template('index.html')

app.run(host='192.168.2.112')

Visit localhost or your servers IP address on Port 5000 to see the content of your HTML page.

Interacting with your HTML​

Now we have a static website that is being served by Flask. But there is no interface between the web frontend and the Python backend. For this we have to create a POST Route in Flask that allows us to send data from the frontend to the backend:

@app.route('/', methods=['GET'])
def home_get():
return render_template('index.html')

@app.route('/', methods=['POST'])
def home_post():
return render_template('index.html')

Now we can add a Form Element to our website that can perform a Post Request to send the content of it's input fields to our Flask backend:

<form method="POST">
<div><input name="first"/></div>
<div><input name="sec"/></div>
<p><strong></strong></p>
<button>Multiply!</button>
</form>

So now - whenever the page is loaded we receive a GET request. But pressing the multiply button will send a POST request:

[10/Oct/2022 12:16:55] "GET / HTTP/1.1" 200 -
[10/Oct/2022 12:16:57] "POST / HTTP/1.1" 200 -

When we print(request.form) inside home_post() we can now see that we are receiving the values we put in to the frontend in our Flask backend:

ImmutableMultiDict([('first', '5'), ('second', '5')])

We can grab them from there and write them into variables:

def home_post():
# print(request.form)
val1 = request.form['first']
val2 = request.form['second']
return render_template('index.html')

And now we can manipulate them however we like and print the result:

result = float(val1) * float(val2)
print(result)

To output the result to the web frontend we can add JinJa variables:

<p>Result: <strong>{{result}}</strong></p>

And use the return statement of our function to return this value:

return render_template('index.html', result=result)