Skip to main content

Transform Flask into a structured MVC architecture with powerful CLI tools

Project description

Flask MVC

Flask MVC Logo

GitHub code size in bytes GitHub Workflow Status GitHub PyPI - Downloads PyPI - Python Version PyPI Code style: black

Transform your Flask application into a structured MVC architecture with powerful CLI tools

InstallationQuick StartDocumentationExamplesContributing

🚀 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

🤝 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

GitHub stars GitHub forks GitHub watchers


Made with ❤️ by Marcus Pereira

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flask_mvc2-0.1.0.tar.gz (16.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flask_mvc2-0.1.0-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

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

Hashes for flask_mvc2-0.1.0.tar.gz
Algorithm Hash digest
SHA256 7ba5cabd6b958de2742808dea510b4dc2a0bffa2084b5ffe02a827260794887e
MD5 481457c4058d31389efea492af99a891
BLAKE2b-256 35af78ddd5efc0dd43b28dbb0a7481b8fe6711a0c289f23e2c40e2f886c59cb1

See more details on using hashes here.

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

Hashes for flask_mvc2-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 164d1ed77a6ce687a97645ca752b790a00d32e1f37497fb33f4d21fb3c802624
MD5 08591d8e42f2571daa6df335b76b4917
BLAKE2b-256 de593c634cf878a1dedd5a6b598746f7dfc2f25c6dcc152b2ec3e7e078351f01

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page