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.