3.4. Add a Route#
To a web application a route is a URL pattern that is handled by a particular
view. In Django a view is a function that generates the HTML to be sent back
to the web browser. If you carefully followed the Django instructions you
probably noticed that going to the index page (/) of your web application
takes you to a 404 error page. That’s because you removed the default route
that matches URLs that aren’t polls/ or admin/. In this lab you’ll create a
new view that shows a useful index page.
Installing a New Python Package#
I’ve created a function that gathers information about the machine your app is
running on and displays the information. The function uses the psutil package
which isn’t installed by default. Install it into your dev environment like
this:
$ pip install psutil
Note
Make a note of every Python package you install, you’ll need it in your
Dockerfile
Create an HTML Template#
It’s awkward to put a lot of HTML code into Python files. Django comes with a
templating engine that allows you to write mostly HTML code that has values
inserted into it by Django. Put this code into a file called
polls/templates/index.html. You will have to create the polls/templates
directory first.
<!DOCTYPE html>
<html>
<header>
<title>My CIS-92 Project</title>
</headder>
<body>
<h1>{{ host }}</h1>
<strong>A project by {{ user }}</strong>
<p><a href="polls/">Goto Polls</a></p>
<p><a href="admin/">Goto Admin</a></p>
<h2>Network Interfaces:</h2>
<pre>{% for iface, data in net_if_addrs.items %}
{{ iface }}
{% for addrfam in data %}{{ addrfam.address }}
{% endfor %}
{% endfor %}</pre>
<h2>CPU Load Average:</h2>
<pre>{{ loadavg }}</pre>
<h2>Disk Usage</h2>
<pre>Total: {{ disk_usage.total | floatformat:"0g" }} Used: {{ disk_usage.used | floatformat:"0g" }} {{ disk_usage.percent }}%</pre>
</body>
</html>
Create a Function#
This Python function is what gets called when your route is activated. A
function can serve any URL route, even more than one in your application.
Functions can take arguments from the route too. Take a look at how the polls
route works for more information. Add this function to polls/views.py:
import os
import psutil
from django.shortcuts import render
def site_index(request):
"""The default view for our page."""
template_data = {
'user': os.environ.get('STUDENT_NAME', "(No Username)"),
'host': os.environ.get('SITE_NAME', "localhost.localdomain"),
'net_if_addrs': psutil.net_if_addrs(),
'disk_usage': psutil.disk_usage('/'),
'loadavg': psutil.getloadavg(),
}
return render(request, "index.html", template_data)
Note
This function uses environment variables! We’ll talk about those in the next lab.
Add the Route#
Now that we have a template and a function we need to tell Django to call your
function when it sees a certain URL pattern. In our case we just want to show a
working page in response to an empty URL pattern. There are two changes we need
to make to mysite/urls.py. Make it look like this:
from django.contrib import admin
from django.urls import include, path
from polls.views import site_index
urlpatterns = [
path("polls/", include("polls.urls")),
path("admin/", admin.site.urls),
path("", site_index), # Default
]
Test Your Changes#
Now that you’ve updated the source you should be able to run your development server and see the new landing page.
$ python manage.py runserver
You will notice that the page says “A project by (No Username)”. Your name is
controllable by the environment. Try restarting your development server after
setting the STUDENT_NAME and SITE_NAME variables in the shell:
$ export STUDENT_NAME="Bike Batera"
$ export SITE_NAME="www.bikebatera.com"
$ python manage.py runserver