Bootstrap FreeKB - Flask - Redirect a user to an HTML page using url_for
Flask - Redirect a user to an HTML page using url_for

Updated:   |  Flask articles

Flask uses the MVC (Model View Controller) Framework. Just to make this as obvious as possible, I like my Flask apps to have the following.

  • Model -> models.py
  • View -> views.py
  • Controller -> __init__.py

For example, let say you have the following.

├── main.py
├── my-project (directory)
│   ├── __init__.py
│   ├── views.py
│   ├── templates (directory)
│   │   ├── base.html
│   │   ├── home.html
│   │   ├── foo.html
│   │   ├── bar.html

 

At a high level, there are two Flask functions that can be used to redirect a user to an HTML page.

Here is an example of how you could use url_for in a Blueprint Route to redirect a user from /foo.html to /bar.html.

In this example "views" in the name of the Blueprint you want to redirect to and "bar" is the name of the route.

from flask import Blueprint, render_template, redirect, url_for

views = Blueprint('views', __name__)

@views.route('/foo')
def home():
    return redirect(url_for('views.bar'))

@views.route('/bar')
def bar():
    return render_template('bar.html')

 

Let's say you want to redirect a user to an HTML page with parameters. For example, to redirect a user to foo.html?token=xyz.

from flask import Blueprint, render_template

views = Blueprint('views', __name__)

@views.route('/foo')
def foo():
    return render_template('foo.html?token=xyz')

 

If you try to do this with only render_template, a TemplateNotFound exception will be raised, something like this.

jinja2.exceptions.TemplateNotFound: foo.html?token=xyz

 

Here is how you can redirect a user to an HTML page with parameters using url_for and render_template. In this example, when the user requests the /foo endpoint they will be redirected to /bar?greeting='hello'

from flask import Blueprint, render_template, redirect, url_for

views = Blueprint('views', __name__)

@views.route('/foo')
def home():
    return redirect(url_for('views.bar', greeting='hello'))

@views.route('/bar')
def bar():
    return render_template('bar.html')

 




Did you find this article helpful?

If so, consider buying me a coffee over at Buy Me A Coffee



Comments


Add a Comment


Please enter 1a8460 in the box below so that we can be sure you are a human.