Project Example

This chapter demonstrates a complete Flask application structure combining all the concepts learned.

Complete Project Structure

flask-blog/
├── app/
│   ├── __init__.py          # Application factory
│   ├── extensions.py        # Extension instances
│   ├── models.py           # Database models
│   ├── forms.py            # WTForms classes
│   ├── auth/
│   │   ├── __init__.py
│   │   └── routes.py       # Authentication routes
│   ├── main/
│   │   ├── __init__.py
│   │   └── routes.py       # Main routes
│   ├── templates/
│   │   ├── base.html
│   │   ├── auth/
│   │   └── main/
│   └── static/
│       ├── css/
│       └── js/
├── tests/
│   ├── __init__.py
│   ├── conftest.py
│   └── test_auth.py
├── instance/
│   └── config.py
├── migrations/
├── .env
├── requirements.txt
└── wsgi.py

Key Files Content

Application Factory

# app/__init__.py
from flask import Flask
from .extensions import db, migrate, login_manager
from .auth import bp as auth_bp
from .main import bp as main_bp

def create_app(config_object=None):
    app = Flask(__name__, instance_relative_config=True)
    
    # Configuration
    app.config.from_mapping(
        SECRET_KEY="dev",
        SQLALCHEMY_DATABASE_URI="sqlite:///blog.db",
        SQLALCHEMY_TRACK_MODIFICATIONS=False,
    )
    
    if config_object:
        app.config.from_object(config_object)
    
    # Initialize extensions
    db.init_app(app)
    migrate.init_app(app, db)
    login_manager.init_app(app)
    login_manager.login_view = "auth.login"
    
    # Register blueprints
    app.register_blueprint(auth_bp, url_prefix="/auth")
    app.register_blueprint(main_bp)
    
    return app

Extensions

# app/extensions.py
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager

db = SQLAlchemy()
migrate = Migrate()
login_manager = LoginManager()

User Model

# app/models.py
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from .extensions import db

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password_hash = db.Column(db.String(255), nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)

    def set_password(self, password):
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    created_at = db.Column(db.DateTime, server_default=db.func.now())

This example demonstrates:

  • Application factory pattern
  • Blueprint organization
  • Database models with relationships
  • Authentication integration
  • Proper project structure

Running the Project

# Development
export FLASK_APP=app:create_app
flask run --debug

# Production
gunicorn -w 4 -b 0.0.0.0:8000 "app:create_app()"

# Database migrations
flask db init
flask db migrate -m "Initial setup"
flask db upgrade