Skip to main content

Too. Much. Code.

Too. Much. Code.

As you've probably figured out by now, your flask files get pretty big pretty quickly.


No one wants all of that code in one page. It's too much.


Today we will learn how to use templating and redirecting to slim things down a bit.


👉 Here's some simple Flask code to start us off:


from flask import Flask

app = Flask(__name__)

@app.route('/')

def index():

  myName = "David"

  page = f"""Hi {myName}"""

  return page

app.run(host='0.0.0.0', port=81)



👉 This is fine for small code, but for much larger projects we can create templates to store our HTML elsewhere. Let's do that now:


1.Create a folder called template.

2.Create an HTML file called portfolio inside the template folder.


3.Now I'm going to paste my portfolio code from before into the portfolio page.

4.Next, I create a CSS folder and a file called style.css. I paste my CSS for the portfolio page into that file.

5.Edit my HTML in the portfolio page to fully reference the style.css file in the static folder.

<link href="/static/css/portfolio.css" rel="stylesheet" type="text/css" />  

6.Make sure all of my images, etc. are in suitable subfolders in static. Edit all the references in portfolio.html to ensure that they have the proper file paths.

Now, back in main.py... 

1.Set our fString to blank
2.Revist an old friend f= open()
3.Open the portfolio.html file
4.Read the contents into the 'page' variable

@app.route('/')
def index():
  myName = "David"
  page = ""
  f = open("template/portfolio.html", "r")
  page = f.read()
  f.close()
  return page


More Pages
👉 Next, I'm going to add a 'home' page to the Flask code. 

from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
    return 'Hello from Flask!'

@app.route('/home') # Creates the path to the home page
def home(): # Subroutine to create the home page
  # Three quotes followed by the html for the baldies site. Three more quotes to close. All the HTML is assigned to the 'page' variable
  page = """html
  
  <html>
    
  <head>
    <title>David's World Of Baldies</title>
  </head>


  <body>
  <h1>Dave's World of Baldies</h1> 
  <h2>Welcome to our website!</h2>

  <p>We all know that throughout history some of the greatest have been Baldies, let's see the epicness of their heads bereft of hair.</p>

  <h2>Gallery of Baldies</h2>
  <p>Here are some of the legends of the bald world.</p>

  <img src="images/picard.jpg" width = 30%> 
  <p><a href = "https://memory-alpha.fandom.com/wiki/Star_Trek:_Picard">Captain Jean Luc Picard: Baldest Star Trek captain, and legend.</a></p>

  <ul>
    <li>Beautiful bald man</li>
    <li>Calm and cool under pressure</li>
    <li>All the Picard memes</li>
  </ul>

  <p><a href = "page2.html">Go to page 2</a></p>
  
</body>
  
</html>
  
  """
  
  return page # returns the contents of the page variable


app.run(host='0.0.0.0', port=81)   

fStrings and Replacing
Using fStrings and the .replace() string manipulation technique from many lessons ago lets us customize the webpage for our user. Here's how:

👉 First, I've put a placeholder for a name in my portfolio.html file.

<body>
  <h1>{name}'s Portfolio</h1>


👉 Now in the Flask code, I can use the replace() function. Note that I've done this before the return command.

@app.route('/')
def index():
  myName = "Katie"
  page = ""
  f = open("template/portfolio.html", "r")
  page = f.read()
  f.close()
  page = page.replace("{name}", myName) # Replace all instances of {name} with the contents of the 'myName' variable
  
  return page


I can reuse this technique to make multiple changes to a page.

👉 Let's look at some example code where I've done this to create a generic page that can be customised by the user:

<body>
  <h1>{name}'s Portfolio</h1>
  <h2>{title}</h2>
  <p>{text}</p>
<a href="{link}"><img src="static/images/{image}" width="500px"></a>


👉 Now in my main code, all I have to do is store the information in variables and use multiple replace. 

def index():
  myName = "Katie"
  title = "Day 56 Solution"
  text = "So, day 56 was all about using csv reading and file and folder manipulation to make 100 files in dozens of folders. This was tricky because the names of the folders and files were based on the top 100 streaming songs and so weren't simple to encode."
  image = "56.png"
  link = "https://replit.com/@DavidAtReplit/Day-056-Solution#main.py"
  
  page = ""
  f = open("template/portfolio.html", "r")
  page = f.read()
  f.close()
  page.replace("{name}", myName)
  page.replace("{title}", title)
  page.replace("{text}", text)
  page.replace("{image}", image)
  page.replace("{link}", link)
  return page  


👉 For example, I could create Day 56 as its own app.route like this:

@app.route('/56')
def fiftySix():
  myName = "Dave"
  title = "Day 56 Solution"
  text = "So, day 56 was all about using csv reading and file and folder manipulation to make 100 files in dozens of folders. This was tricky because the names of the folders and files were based on the top 100 streaming songs and so weren't simple to encode."
  image = "56.png"
  link = "https://replit.com/@DavidAtReplit/Day-056-Solution#main.py"
  
  page = ""
  f = open("template/portfolio.html", "r")
  page = f.read()
  f.close()
  page.replace("{name}", myName)
  page.replace("{title}", title)
  page.replace("{text}", text)
  page.replace("{image}", image)
  page.replace("{link}", link)
  return page 


Redirecting

Redirecting is useful when you want to send a user to another web address, but that address is really long.

It requires another import at the top of the main.py file:

from flask import Flask, redirect


👉 Now I'll add an app route. In this example, I want to redirect users to my page for Day 77. All I put in the subroutine is a return redirect("") with the URL in the quotes.

from flask import Flask, redirect
@app.route('/77')
def seventySeven():
  return redirect("https://replit.com/@DavidAtReplit/Day-077-Solution#main.py")
  
  return page


This is really powerful. You've effectively created your own link shortener. All the user has to do is add /77 to the end of the home page URL.


Comments

Popular posts from this blog

Automate! Automate!

 Making this customizable 👉So how about making our search user customizable? In the code below, I have: Asked the user to input an artist (line 14) Tidied up their input (line 15) formatted the search URL as an fString that includes the artist (line 19) Here's tAutomate! Automate! We are so close. I can taste it, folks! Massive kudos on getting this far! Today's lesson, however, will work best if you have one of Replit's paid for features (hacker plan or cycles). Free plan Repls 'fall asleep' after a while. Automation kinda relies on the Repl being always on. If you have hacker plan or you've bought some cycles, then you can enable always on in the drop down menu that appears when you click your Repl name (top left).he code: This is important because when our repl is always running, it can keep track of time and schedule events. 👉 I've set up a simple schedule that prints out a clock emoji every couple of seconds. It works like this: Import schedule librar...

HTTP & Sessions

 HTTP & Sessions One of the main protocols (rules that govern how computers communicate) on the web is called HTTP. HTTP is what is known as a stateless protocol. This means that it doesn't 'remember' things. It's a bit like having a conversation with a goldfish. You can ask a question and get a reply, but when you ask a follow up question, the original has already been forgotten, as has who you are and what you were talking about. So if HTTP is stateless, how come my news site remembers to give me the weather for my home town, my preferred South American river based online store tells me when it's time to order more multivitamins, and I'm justifiably proud of my #100days success streak? The answer is......... Sessions Sessions are a way of storing files on your computer that allows a website to keep a record of previous 'conversations' and 'questions' you've asked. By using sessions, we can store this info about the user to access later....

Incoming!

 Incoming! Today, we're going to learn how to deal with data from forms in Flask. 👉 To start, I've added yesterday's HTML code for my form in main.py for you already. (You're welcome!) Go take a look! 👉 However, at the moment, the app.route() has no method associated with it, so I need to create a route for this page to receive the data. First, I need a new import: request. Then I create the app.route - I also need to add an extra argument to specify the methods being received. At the moment, that's just 'post', but it does need to be ALL CAPS - POST. Finally I define the process() subroutine that returns request.form 👉 Here's the new code on its own: from Flask import Flask, request app.route('/process', methods=["POST"]) def process():   return request.form 👉 And here it is as part of the whole code: from flask import Flask, request app = Flask(__name__) app.route("/process", methods=["POST"]) def process():   ...