#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