Flask Routing Fundamentals
Flask maps URLs to Python functions using @app.route() decorators.
Create dynamic web pages with URL parameters and HTTP methods.
URL
Decorator
Method
/
@app.route('/')
GET (Home)
/user/123
@app.route('/user/')
GET (Dynamic)
/login
@app.route('/login', methods=['POST'])
POST (Form)
/api/users
@app.route('/api/users', methods=['GET', 'POST'])
API (REST)
Hello World Flask App
🚀 python app.py → http://localhost:5000
http://localhost:5000
🏠 Home Page
Welcome to Flask!
📊 Status: Running
🛠️ Framework: Flask 2.3+
🔥 Ready for production
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return '''
Welcome to Flask! 🚀
Server running at localhost:5000
'''
@app.route('/about')
def about():
return '
About Flask Lightweight Python web framework
'
@app.route('/user/
')
def user_profile(user_id):
return f'User Profile: {user_id} '
if __name__ == '__main__':
app.run(debug=True)
HTTP Methods (REST)
GET - Read Data
@app.route('/api/users', methods=['GET'])
def get_users():
users = ['Alice', 'Bob', 'Charlie']
return {'users': users, 'count': len(users)}
POST - Create Data
from flask import request
@app.route('/api/users', methods=['POST'])
def create_user():
data = request.json
return {'message': 'User created', 'user': data}, 201
PUT - Update Data
@app.route('/api/users/', methods=['PUT'])
def update_user(id):
data = request.json
return {'message': f'User {id} updated'}
DELETE - Remove Data
@app.route('/api/users/', methods=['DELETE'])
def delete_user(id):
return {'message': f'User {id} deleted'}, 200
Jinja2 Templates
http://localhost:5000/users
👥 Users Page
Alice Smith
alice@email.com
Bob Johnson
bob@email.com
Add User
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/users')
def users():
user_data = [
{'name': 'Alice Smith', 'email': 'alice@email.com'},
{'name': 'Bob Johnson', 'email': 'bob@email.com'}
]
return render_template('users.html', users=user_data)
# templates/users.html
"""
Users
Users ({{ users|length }})
{% for user in users %}
{{ user.name }}
{{ user.email }}
{% endfor %}
"""
Forms & Validation
from flask import Flask, request, render_template, redirect, url_for, flash
from werkzeug.security import generate_password_hash
app = Flask(__name__)
app.secret_key = 'dev-key'
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if len(password) < 6:
flash('Password must be 6+ characters')
return render_template('register.html')
# Save user (database)
hashed = generate_password_hash(password)
flash('Registration successful!')
return redirect(url_for('login'))
return render_template('register.html')
📝 register.html Template
{% with messages = get_flashed_messages() %}
{% if messages %}
{{ messages[0] }}
{% endif %}
{% endwith %}
Database Integration
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
db = SQLAlchemy(app)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
date = db.Column(db.DateTime, default=datetime.utcnow)
@app.route('/posts')
def posts():
all_posts = Post.query.all()
return render_template('posts.html', posts=all_posts)
@app.route('/create', methods=['POST'])
def create_post():
title = request.form['title']
content = request.form['content']
post = Post(title=title, content=content)
db.session.add(post)
db.session.commit()
return redirect(url_for('posts'))
Production Features
Blueprints (Modular Apps)
# auth/blueprint.py
from flask import Blueprint
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/login')
def login():
return 'Login page'
# app.py
app.register_blueprint(auth_bp, url_prefix='/auth')
# Now: /auth/login
Environment Config
import os
from dotenv import load_dotenv
load_dotenv()
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY')
app.config['DATABASE_URL'] = os.getenv('DATABASE_URL')
class Config:
DEBUG = os.getenv('FLASK_DEBUG') == 'True'
SQLALCHEMY_TRACK_MODIFICATIONS = False
Deployment
# requirements.txt
"""
Flask==2.3.3
Flask-SQLAlchemy==3.0.5
python-dotenv==1.0.0
Werkzeug==2.3.7
"""
# Procfile (Heroku)
web: gunicorn app:app
# runtime.txt
python-3.11.5
# wsgi.py (production)
from app import app
if __name__ == "__main__":
app.run()
Heroku
Free tier available
Vercel
Serverless
Docker
Production ready
Production Projects
1. Blog Platform
CRUD posts, user auth, comments, search, pagination
2. Task Manager API
REST API + database + authentication + frontend
3. URL Shortener
Custom short URLs, analytics, QR codes, admin dashboard
4. E-commerce Store
Products, cart, checkout, payments, admin panel
Full-Stack Web Developer!
🌐 Production Web Applications:
📱 SaaS Dashboards Analytics, users, billing
🛒 E-commerce Sites Products, cart, payments
📊 REST APIs Mobile + frontend integration
⚙️ Admin Panels CRUD, reports, management
💼 Production Deployments Heroku, Docker, AWS
Deploy full-stack web applications worldwide! 🚀