Variables and Routing in Flask
#
Learning ObjectivesAfter this lesson, you will be able to:
- Display variables on a webpage.
- Create a route in Flask.
#
Multiple RoutesTalking Points:
One of the things that makes Python so fantastic is that it is object-oriented.
Assigning variables turns them into a type of object โ with an object, we can do some awesome things.
We're going to look at variables in our Flask app. Creating variables allows us to return values of those variables, as well as provides us with all the methods and attributes in that type of object.
Routes allow us to extend this a step further โ we can take variables and put them into our URL, which we can then use to render some data on the page.
Our website is cool, but it's just one page.
What about recipe pages? "About" pages?
We need to use
routes
.
But first, we need to learn variables
.
#
Variables? Again?Yes! Regular variables.
x = "this string"
Difference: Here, we're in the Flask app.
Very specific use cases:
- Routes (We're learning now.)
- Templates (We'll learn next.)
- Requests (We'll learn later.)
Talking Points:
- When we're talking about variables here, we're talking about the same thing as variables in base Python.
- You assign a variable to a value and that value gets stored in memory.
- We'll go over some common use cases for including variables in your Flask app.
- Note, however, that using variables in templates and requests will be covered in a later lesson.
#
Three Ways to Read in a VariableTalking Points:
- There are several ways to obtain the value for a variable.
- Depending on that value and what it represents, there are different ways of going about entering that into our Flask app.
- The first is to have the variable assignment take place right in our Flask app.
- Another is to read it from a Python script, like you would for any other library.
- Yet another is to read it in from a file, unlike you would import any library.
Variables come from:
- Within our Flask app.
- From another Python file.
- From any other file.
#
Method 1: Set Variables in Our Flask AppTalking Points:
- The easiest way to obtain a value from a variable in Flask is to assign it directly in your Flask app.
- This makes sense if we are only trying to output a very small amount of information.
- Consider the following modification on our
Hello World
app.
These aren't set inside def hello()
.
- What does that make them?
hello_variables.py
from flask import Flask
app = Flask(__name__)
my_job_title = "Python pro"
@app.route('/')def hello(): return "Hello, " + my_job_title
if __name__ == '__main__': app.run(debug=True)
#
We Do: In-App Variables- We can practice this: In your existing
my_website.py
, comment out thereturn render_template("index.html")
.
Instead, have:
my_job_title = "Python pro"
@app.route('/')def home(): return "Hello, " + my_job_title
Current Code Status:
The code could look like this now:
from flask import Flask, render_templateapp = Flask(__name__)
my_job_title = "Python pro"
@app.route('/')def home(): return "Hello, " + my_job_title
def hello_world(): line1 = "<h1><b>Hello</b> World!</h1>" line2 = "<p>If music be the food of love, play on!</p>" line3 = "<img src='https://media.giphy.com/media/sWrDT2OqxJ3Fu/giphy.gif'>" total = line1 + line2 + line3 # return render_template("index.html")if __name__ == '__main__': app.run(debug=True)
#
Method 2: Read Variables From a Python FileTalking Points:
The next way to read in a variable is to assign it in a Python file, then import that file.
This is considered the most "pythonic" way to read variables into other Python files.
In order to use this approach, you need another file that ends in
.py
.You then read this file into your Flask app with an
import <myFile>
.You're never limited to just one
.py
file!New Python file:
mySecrets.py
username = "Guy Fieri"password = "flavortown"
How would we print that in our Flask app?
Any ideas?
#
We Can Import the FileYour normal Flask app:
from flask import Flaskimport mySecrets ## You can import any file!
app = Flask(__name__)
## Call it like a module.my_name = mySecrets.usernamemy_password = mySecrets.password
@app.route('/')def hello(): return "Hello, " + my_name + ", welcome to " + my_password
if __name__ == '__main__': app.run(debug=True)
#
Method 2: Use CasesTalking Points:
- A great use case for this is when you'd like to have your secret info (tokens, passwords, etc.) in a file that isn't your Flask app.
- When you push your code to GitHub, you can then have your Flask app open for the world to see, and your passwords safely in a file on your local drive.
- Another use case is file management. Pretend you have a lot of variables that may not make it into every file, but you want a "master file" from which to read all these variables.
Why?
- You have secret info (tokens, passwords, etc.) โ keep them locally!
- You have many Flask pages, so you make a "master file" to hold all variables.
py
File#
Your Turn: Another Now it's your turn!
- Make a file called
python_variables.py
in the same folder asmy_website.py
. - Insert some variables into
python_variables.py
- perhaps some books you like. - Import
python_variables
into your Flask app,my_website.py
. - Display the values from
python_variables
in your Flask app.
#
Method 3: Reading From a Non-Python File- Yet another way to read variables in is in non-Python files.
- Not all data/info you'll need will be in a static Python file.
- This approach is a combo of one of the earlier two approaches.
- Pretend say you have another file that's a .txt file.
- We can do two things:
- Read that .txt file in directly in our Flask app and set that to a variable (like Approach 1).
- Read that .txt in with another file and save that to a variable which your Flask app reads (like Approach 2).
- Here, we take Approach 1. First, though, we create a .txt file.
- Then, we open it with
os
andfile open
. - Then, we set that .txt to a variable and print that variable in our
route()
function.
Let's create a .txt
file called hi.txt
in the same folder where our app lives. We'll include some Shakespeare poetry.
So are you to my thoughts as food to life,Or as sweet-seasoned showers are to the ground;
How do you think we get this into our Flask app?
#
With File OpenThen, we'll add a bit in our Flask app:
import os # Note the new import โ to be in the file system.
file_path = '.'# Note the "with"! We don't need "close".with open(os.path.join(file_path, 'hi.txt')) as f: the_text = f.read()
@app.route('/text')def read_txt(): return the_text
.txt
File#
You Do: Add a Now it's your turn!
- Make a file called
more_variables.txt
in the same folder asmy_website.py
. - Write some information into
more_variables.txt
โ perhaps what you'd like for breakfast tomorrow. import os
so you can find the file.- Use this code:
with open(os.path.join(file_path, 'more_variables.txt')) as f: the_text = f.read()
- Display the text from
more_variables
in your Flask app.
Current Code Status: Possible solution code:
from flask import Flaskimport mySecrets ## You can import any file!import python_variablesimport os # Note the new import โ to be in the file system.
app = Flask(__name__)
## Call it like a module.my_name = mySecrets.usernamemy_password = mySecrets.password
student_name = python_variables.student_name
file_path = '.'
with open(os.path.join(file_path, 'more_variables.txt')) as f: the_text = f.read()
@app.route('/text')def read_txt(): return the_text
@app.route('/')def hello(): return "Hello, " + my_name + ", welcome to " + my_password + ". You are " + student_name + ". More variables are: " + the_text
if __name__ == '__main__': app.run(debug=True)
#
Knowledge CheckWhat are the three approaches to read in variables to a Flask app?
Teaching Tip:
- Answer: Reading directly in our Flask app, from a Python file and importing, and from a non-Python file.
#
Part 2. Routing@app.route('/')
, Anyway?#
What Is That Talking Points:
- By now, you may be wondering about that
@app
that we keep putting on the line before our function.@
is a way to use a "decorator."- A decorator is a way to put one Python function into another Python function.
- More formally, this process is called "wrapping a function" inside of another function.
- You can check out more on decorators later, but for now, knowing that our
@app.route(endpoint)
is a way that we pass an argument โ the endpoint โ into a routing function. - In other words: We tell our Flask app to listen to a particular endpoint and then we have a function that happens if that endpoint gets hit.
We have:
- Listen to an endpoint (here,
/
). - Do
def home()
if someone goes there.
@app.route('/') # When someone goes here...def home(): # Do this. return render_template("index.html")
http://127.0.0.1:5000/
=> render_template("index.html")"
What if we want to go to http://127.0.0.1:5000/sayHi
?
#
Suddenly, a New Page- This is routing.
- New pages on our web app!
@app.route('/sayHi') # When someone goes here...def hello(): # Do this. return "Hello, Mr. Fieri."
#
We Do: Add a RouteIn
my_website.py
, underdef home()
, add:@app.route('/sayHi') # When someone goes here...def hello(): # Do this. return "Hello, Mr. Fieri."
Reload the page! Go to
http://127.0.0.1:5000/sayHi
.
Current Code Status: Possible code:
from flask import Flask, render_templateimport mySecrets ## You can import any file!import python_variablesimport os # Note the new import โ to be in the file system.
app = Flask(__name__)
## Call it like a module.my_name = mySecrets.usernamemy_password = mySecrets.password
student_name = python_variables.student_name
file_path = '.'
with open(os.path.join(file_path, 'more_variables.txt')) as f: the_text = f.read()
@app.route('/text')def read_txt(): return the_text
@app.route('/') # When someone goes here...def home(): # Do this. return render_template("index.html")
@app.route('/sayHi') # When someone goes here...def hello(): # Do this. return "Hello, Mr. Fieri."
if __name__ == '__main__': app.run(debug=True)
#
What Is a Route?Talking Points:
A route in our context here consists of our
localhost:5000
, as well as the rest of our URL.We pass the rest of our endpoint into our
app.route()
function as an argument.This means everything inside of the parentheses and inside of quotes becomes our URL.
The URL:
http://127.0.0.1:5000/sayHi
We route to different URLs:
http://127.0.0.1:5000/sayHi
http://127.0.0.1:5000/Cats
http://127.0.0.1:5000/profile
sayHi
,Cats
,/
, andprofile
are endpoints from our main app.We only need to add:
@app.route('/<endpoint>') # When someone goes here...def function_name(): # Do this. return string
#
You Do: Adding a RouteIn
my_website.py
, add a new route to arandnum
endpoint.In the function for this endpoint, display a string that's a random number.
- Hint: Remember the
random
module? You can userandint(1, 100)
. - Hint: You can turn an integer to a string with
str(number)
.
- Hint: Remember the
Reload the page and go to your endpoint to try it out!
Current Code Status:
from flask import Flask, render_templateimport mySecrets ## You can import any file!import python_variablesimport os # Note the new import โ to be in the file system.import random
app = Flask(__name__)
## Call it like a module.my_name = mySecrets.usernamemy_password = mySecrets.password
student_name = python_variables.student_name
file_path = '.'
with open(os.path.join(file_path, 'more_variables.txt')) as f: the_text = f.read()
@app.route('/text')def read_txt(): return the_text
@app.route('/') # When someone goes here...def home(): # Do this. return render_template("index.html")
@app.route('/sayHi') # When someone goes here...def hello(): # Do this. return "Hello, Mr. Fieri."
@app.route('/randnum')def randnum(): return str(random.randint(1, 100))
if __name__ == '__main__': app.run(debug=True)
#
Variables in the RouteTalking Points:
OK, so I said these are two separate concepts, but that's only halfway true.
We can actually assign values in the URL to into variables in our Flask app.
Why would we do this? Because we can change the URL to reflect what sort of data we wish to see.
In the code snippet you see here: We are assigning the name variable to a value, which we insert into our function and then return to the user, in the middle of a sentence.
You can pass a variable in the route itself.
It's a dynamic endpoint!
You can use that variable in your function.
@app.route('/sayHi/<name>')def hello(name): return "Hello, " + name + ", your coding skills impress me!"
http://localhost:5000/sayHi/Hari
=> Hello, Hari, your coding skills impress me!"
Current Code Status:
from flask import Flask, render_templateimport mySecrets ## You can import any file!import python_variablesimport os # Note the new import โ to be in the file system.import random
app = Flask(__name__)
## Call it like a module.my_name = mySecrets.usernamemy_password = mySecrets.password
student_name = python_variables.student_name
file_path = '.'
with open(os.path.join(file_path, 'more_variables.txt')) as f: the_text = f.read()
@app.route('/text')def read_txt(): return the_text
@app.route('/') # When someone goes here...def home(): # Do this. return render_template("index.html")
@app.route('/sayHi/<name>')def hello(name): return "Hello, " + name + ", your coding skills impress me!"
@app.route('/randnum')def randnum(): return str(random.randint(1, 100))
if __name__ == '__main__': app.run(debug=True)
#
Your TurnTry adding route in your Flask app to have:
- A
/timesfour/<number>
route that displays the product of an integer in the route multiplied by four. - A
repeat
route that takes a string passed into the URL, then displays it four times in a row.
#
Final Code StatusYour code should look similar to this:
from flask import Flask, render_templateimport mySecrets ## You can import any file!import python_variablesimport os # Note the new import โ to be in the file system.import random
app = Flask(__name__)
## Call it like a module.my_name = mySecrets.usernamemy_password = mySecrets.password
student_name = python_variables.student_name
file_path = '.'
with open(os.path.join(file_path, 'more_variables.txt')) as f: the_text = f.read()
@app.route('/text')def read_txt(): return the_text
@app.route('/') # When someone goes here...def home(): # Do this. return render_template("index.html")
@app.route('/sayHi/<name>')def hello(name): return "Hello, " + name + ", your coding skills impress me!"
@app.route('/timesfour/<number>')def timesfour(number): return str(int(number) * 4)
@app.route('/repeat/<number>')def repeat(number): return number * 4
if __name__ == '__main__': app.run(debug=True)
#
SummaryWe covered variables and routing in Flask:
Variables can be made:
- In the Flask app: Used like normal variables.
- In a Python file: Imported like a module.
- In another file: Used
file
to read it.
Routing:
@app.route(<endpoint>)
is how we make new pages in our app!