What are Routes?

Routes map URLs to Python functions. When a user visits a URL, Flask calls the corresponding function (view) and returns the response.

Basic Route

Create a simple route:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

@app.route('/about')
def about():
    return 'About Page'

if __name__ == '__main__':
    app.run(debug=True)

Dynamic Routes

Routes with variable parts:

# Single variable
@app.route('/user/<username>')
def show_user(username):
    return f'User: {username}'

# Multiple variables
@app.route('/user/<username>/<int:user_id>')
def user_profile(username, user_id):
    return f'User {username} (ID: {user_id})'

Route Variable Types

Specify variable types:

# String (default)
@app.route('/user/<username>')  # username is string

# Integer
@app.route('/post/<int:post_id>')  # post_id is integer

# Float
@app.route('/price/<float:price>')  # price is float

# Path (includes slashes)
@app.route('/path/<path:filepath>')  # filepath can have /

# UUID
@app.route('/uuid/<uuid:uuid_value>')  # UUID format

HTTP Methods

Handle different HTTP methods:

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        # Process login
        return 'Login successful'
    else:
        # Show login form
        return '''
        <form method="post">
            <input name="username">
            <input type="password" name="password">
            <button type="submit">Login</button>
        </form>
        '''

Request Data

Access request data:

from flask import request

@app.route('/submit', methods=['POST'])
def submit():
    # Form data
    name = request.form.get('name')
    email = request.form.get('email')
    
    # Query parameters (?key=value)
    page = request.args.get('page', 1, type=int)
    
    # JSON data
    if request.is_json:
        data = request.get_json()
    
    # Headers
    user_agent = request.headers.get('User-Agent')
    
    return 'Submitted'

URL Building

Generate URLs dynamically:

from flask import url_for

@app.route('/')
def index():
    return 'Home'

@app.route('/user/<username>')
def profile(username):
    return f'Profile: {username}'

# In templates or code
url = url_for('index')  # '/'
url = url_for('profile', username='alice')  # '/user/alice'

Redirects

Redirect to other routes:

from flask import redirect, url_for

@app.route('/old')
def old_page():
    return redirect(url_for('new_page'))

@app.route('/new')
def new_page():
    return 'New Page'

# Or redirect to external URL
@app.route('/external')
def external():
    return redirect('https://example.com')

Error Handlers

Handle errors with custom pages:

@app.errorhandler(404)
def not_found(error):
    return 'Page not found', 404

@app.errorhandler(500)
def internal_error(error):
    return 'Internal server error', 500

Route Decorators

Add functionality with decorators:

from functools import wraps

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated:
            return redirect(url_for('login'))
        return f(*args, **kwargs)
    return decorated_function

@app.route('/protected')
@login_required
def protected():
    return 'Protected content'

Blueprint Routes

Organize routes with blueprints:

from flask import Blueprint

# Create blueprint
auth = Blueprint('auth', __name__)

@auth.route('/login')
def login():
    return 'Login page'

@auth.route('/logout')
def logout():
    return 'Logout page'

# Register in main app
from auth import auth
app.register_blueprint(auth, url_prefix='/auth')

Best Practices

  • Use meaningful route names: Clear, descriptive URLs
  • Specify HTTP methods: Only allow necessary methods
  • Validate input: Check and sanitize user input
  • Use blueprints: Organize large applications
  • Handle errors: Provide custom error pages

Next Steps

Learn about Flask templates for rendering HTML, or explore forms for handling user input.