Transform Flask into a structured MVC architecture with powerful CLI tools
Project description
Flask MVC
Transform your Flask application into a structured MVC architecture with powerful CLI tools
Installation • Quick Start • Documentation • Examples • Contributing
🚀 Features
- 🏗️ MVC Architecture: Clean separation of concerns with Models, Views, and Controllers
- ⚡ CLI Generator: Powerful command-line tools to generate controllers, models, and more
- 🎨 Template System: Professional templates with Flask best practices
- 🔧 Flexible Configuration: Customizable paths and settings via environment variables
- 📝 Type Safety: Full type hints support for better development experience
- 🧪 Testing Ready: Built-in support for testing with comprehensive error handling
- 📖 Auto Documentation: Generated code includes professional docstrings
- 🌐 API & Web Support: Content negotiation for both web and API responses
📦 Installation
Using pip
pip install flask_mvc
Using Poetry
poetry add flask_mvc
Development Installation
git clone https://github.com/marcuxyz/flask-mvc.git
cd flask_mvc
poetry install
🏃♂️ Quick Start
Basic Setup
from flask import Flask
from flask_mvc import FlaskMVC
app = Flask(__name__)
FlaskMVC(app)
if __name__ == "__main__":
app.run(debug=True)
Using Application Factory Pattern
from flask import Flask
from flask_mvc import FlaskMVC
mvc = FlaskMVC()
def create_app():
app = Flask(__name__)
# Initialize MVC extension
mvc.init_app(app, path='src') # Custom path (default: 'app')
return app
app = create_app()
Generate Your First Controller
# Generate a basic controller
flask mvc generate controller home
# Generate controller in custom path
flask mvc generate controller user --path src/controllers
# Force overwrite existing controller
flask mvc generate controller admin --force
This creates a professional controller with CRUD operations:
"""HomeController - Generated by Flask MVC CLI."""
from flask import render_template, jsonify, request
from typing import Any, Dict, Optional, Union
class HomeController:
"""Controller for handling home related requests."""
def index(self) -> Union[str, Dict[str, Any]]:
"""Display the index page."""
if request.is_json or request.accept_mimetypes.accept_json:
return jsonify({
"message": "Hello from HomeController!",
"controller": "home",
"action": "index"
})
return "Hello from HomeController!"
# Complete CRUD methods included...
📁 Project Structure
Flask MVC encourages a clean project structure:
your-project/
├── app/ # Main application directory
│ ├── __init__.py
│ ├── controllers/ # Controllers directory
│ │ ├── __init__.py
│ │ ├── home_controller.py
│ │ └── user_controller.py
│ ├── models/ # Models directory (optional)
│ │ └── user.py
│ ├── views/ # Templates directory
│ │ ├── layouts/
│ │ ├── home/
│ │ └── user/
│ └── routes.py # Route definitions
├── tests/ # Test directory
├── requirements.txt # Dependencies
└── app.py # Application entry point
🛠️ CLI Commands
Flask MVC provides powerful CLI commands for rapid development:
Controller Generation
# Basic controller
flask mvc generate controller blog
# API controller
flask mvc generate controller api_v1_users
# Controller with custom path
flask mvc generate controller admin --path admin/controllers
# Force overwrite
flask mvc generate controller posts --force
Available Options
| Option | Short | Description |
|---|---|---|
--path |
-p |
Custom path for generated files |
--force |
-f |
Overwrite existing files |
--help |
-h |
Show command help |
🎯 Examples
Web Application Controller
class BlogController:
def index(self):
posts = Post.get_all()
return render_template('blog/index.html', posts=posts)
def show(self, id: int):
post = Post.get_by_id(id)
return render_template('blog/show.html', post=post)
API Controller
class ApiUserController:
def index(self):
users = User.get_all()
return jsonify([user.to_dict() for user in users])
def create(self):
data = request.get_json()
user = User.create(data)
return jsonify(user.to_dict()), 201
Hybrid Controller (Web + API)
Generated controllers automatically handle both web and API requests:
def index(self) -> Union[str, Dict[str, Any]]:
posts = Post.get_all()
if request.is_json or request.accept_mimetypes.accept_json:
return jsonify([post.to_dict() for post in posts])
return render_template('posts/index.html', posts=posts)
⚙️ Configuration
Environment Variables
Customize Flask MVC behavior using environment variables:
# Custom paths
export FLASK_MVC_CONTROLLERS_PATH="src/controllers"
export FLASK_MVC_VIEWS_PATH="src/templates"
export FLASK_MVC_MODELS_PATH="src/models"
# Template settings
export FLASK_MVC_TEMPLATES_DIR="custom/templates"
export FLASK_MVC_FILE_ENCODING="utf-8"
Programmatic Configuration
from flask_mvc.core.config import CLIConfig
# Override default settings
CLIConfig.DEFAULT_CONTROLLERS_PATH = "src/controllers"
CLIConfig.DEFAULT_VIEWS_PATH = "src/templates"
🧪 Testing
Flask MVC is built with testing in mind:
import pytest
from flask_mvc.core.generators import ControllerGenerator
from flask_mvc.core.exceptions import InvalidControllerNameError
def test_controller_generation():
generator = ControllerGenerator()
# Test valid controller generation
result = generator.generate("test", "/tmp/controllers")
assert result.exists()
# Test invalid name handling
with pytest.raises(InvalidControllerNameError):
generator.generate("123invalid")
📚 Documentation
- Full Documentation - Complete guide and API reference
- Quick Start Guide - Get up and running fast
- Controller Guide - Working with controllers
- Router Guide - Route configuration
- CLI Reference - Command-line tools
🤝 Contributing
We welcome contributions! Please see our Contributing Guidelines for details.
Development Setup
# Clone the repository
git clone https://github.com/marcuxyz/flask-mvc.git
cd flask_mvc
# Install dependencies
poetry install
# Run tests
poetry run pytest
# Run linting
poetry run black .
poetry run flake8
# Build documentation
poetry run mkdocs serve
Reporting Issues
📋 Requirements
- Python: 3.10+
- Flask: 3.0+
- Click: 8.0+ (included with Flask)
- Jinja2: 3.0+ (included with Flask)
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- Flask Community - For the amazing web framework
- Click Team - For the excellent CLI framework
- Contributors - Everyone who has contributed to this project
📊 Stats
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file flask_mvc2-0.1.0.tar.gz.
File metadata
- Download URL: flask_mvc2-0.1.0.tar.gz
- Upload date:
- Size: 16.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.5 Darwin/24.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ba5cabd6b958de2742808dea510b4dc2a0bffa2084b5ffe02a827260794887e
|
|
| MD5 |
481457c4058d31389efea492af99a891
|
|
| BLAKE2b-256 |
35af78ddd5efc0dd43b28dbb0a7481b8fe6711a0c289f23e2c40e2f886c59cb1
|
File details
Details for the file flask_mvc2-0.1.0-py3-none-any.whl.
File metadata
- Download URL: flask_mvc2-0.1.0-py3-none-any.whl
- Upload date:
- Size: 18.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.5 Darwin/24.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
164d1ed77a6ce687a97645ca752b790a00d32e1f37497fb33f4d21fb3c802624
|
|
| MD5 |
08591d8e42f2571daa6df335b76b4917
|
|
| BLAKE2b-256 |
de593c634cf878a1dedd5a6b598746f7dfc2f25c6dcc152b2ec3e7e078351f01
|