1292 words
6 minutes
My Flask Project that contains Multiple Apps

Source: Multi-System_Flask-App on GitHub

Rebuilding a Multi-System Web App with Flask: A Journey from PHP to Python#

In 2022, I set myself a clear challenge: take an existing multi-system PHP project and rebuild it as a modern Flask application in Python. The result of that effort is the repository Multi-System_Flask-App — a learning-focused project that explores how to migrate real functionality from one tech stack to another while preserving (and improving) the core behavior.

This blog-style write‑up walks through:

  • The motivation behind the project
  • The core idea of a “multi-system” app
  • The architecture of the Flask version
  • The user experience and core flows
  • What this migration taught me about web development

Note: The original app was built in PHP. This Flask project is a Python reimplementation of that same multi-system concept.


Why Rebuild a PHP App in Flask?#

The original project was a “Multi-System” web application written in PHP. It bundled several related subsystems (think: users, records, management tools) into a single interface. While the PHP version worked, it had some limitations:

  • Organization was more ad hoc, with logic and presentation often mixed.
  • Routing, templating, and structure were less explicit.
  • Extending or maintaining features could become cumbersome over time.

Rebuilding it in Flask had several goals:

  1. Learn Flask by doing something real
    Rather than following only small tutorials, I wanted to work on a project with actual interconnected features.

  2. Experience a technology migration
    Porting an app forces you to truly understand what the original did, not just copy code.

  3. Apply better structure and separation of concerns
    Flask encourages a cleaner split between routing, logic, and templates.

  4. Leverage Python’s ecosystem
    For data manipulation, scripting, and rapid prototyping, Python felt like a natural fit.


What Is a “Multi-System” App?#

The term “Multi-System” in this context describes a single web application that bundles multiple functional modules under one interface. While the exact modules depend on the original PHP project, a typical “multi-system” academic or practical app often includes things like:

  • User/Account Management
    Registering users, managing logins, assigning roles or permissions.

  • Core Business or Domain Modules
    For example:

    • Students, courses, and grades
    • Products, orders, and inventory
    • Projects, tasks, and reports
  • Administrative Tools
    Basic dashboards, summary pages, or simple reporting views.

In the PHP version, each of these systems might have been represented by separate PHP scripts (users.php, products.php, etc.). In the Flask version, the idea is to re‑express those same systems as structured Flask routes and templates.


High-Level Architecture of the Flask Application#

At a high level, the Flask app follows a classic pattern:

  1. Application Entry Point
    A central file (typically named something like app.py or main.py) where:

    • The Flask application instance is created
    • Configuration is defined
    • Routes or blueprints are registered
    • The development server can be started
  2. Route Handlers (Controllers)
    Functions decorated with @app.route(...) that:

    • Receive HTTP requests
    • Validate and process input
    • Interact with the underlying data (database or in‑memory structures)
    • Render templates or return responses
  3. Templates (Views)
    Jinja2 templates under a templates/ directory that define:

    • Page layouts (headers, navigation, footers)
    • Forms and tables for each system
    • Reused components (like base layouts and partials)
  4. Data Layer
    Depending on the assignment’s scope, this might use:

    • A lightweight database (e.g., SQLite) via SQL or an ORM
    • Or simple Python data structures for demo purposes

The migration from PHP to Flask wasn’t just a language change — it was an opportunity to introduce more explicit structure, making the app easier to navigate, extend, and understand.


Route Design: From PHP Scripts to Flask Endpoints#

In traditional PHP apps, it’s common to have separate entry-point files like:

  • index.php
  • users.php
  • products.php

Each file handles its own logic and HTML. Flask encourages a more centralized and explicit routing style. The equivalent in Flask becomes:

  • @app.route('/') – Home or dashboard
  • @app.route('/users') – User listing
  • @app.route('/users/create', methods=['GET', 'POST']) – Create user
  • @app.route('/products') – Products system
  • and so on…

This shift has several benefits:

  • Routing is declared in one place (or per module/blueprint).
  • URL patterns are easier to reason about.
  • Every endpoint is a Python function with clear responsibilities.

Template Layer: From PHP Echoes to Jinja2#

Another big change in the migration is the templating layer.

In PHP, templates often intermix logic and presentation:

  • <?php echo $variable; ?>
  • <?php foreach ($items as $item) { ?> ... <?php } ?>

In Flask, Jinja2 templates encourage cleaner, more readable views:

  • {{ variable }} for output
  • {% for item in items %} ... {% endfor %} for loops
  • {% if condition %} ... {% endif %} for branching

Typical templates in a multi‑system Flask app might include:

  • templates/base.html
    A layout containing:

    • Site header
    • Navigation menu linking each system
    • Main content block ({% block content %}{% endblock %})
    • Footer
  • templates/index.html
    The home page or dashboard, usually extending base.html and introducing the systems:

    {% extends "base.html" %}
    {% block content %}
    <h1>Welcome to the Multi-System Flask App</h1>
    <p>Select a system from the navigation above.</p>
    {% endblock %}
  • System‑specific templates:

    • templates/users_list.html
    • templates/user_form.html
    • templates/products_list.html
    • etc.

By moving from PHP templates to Jinja2, the project gains:

  • Consistency in view logic
  • Separation of concerns, where Python code lives in route functions, not embedded in markup
  • The ability to reuse layout components more cleanly

Data Flow and Core User Experience#

Although the specific data models depend on the original PHP app, the user experience pattern in the Flask version is familiar and intuitive:

1. Home / Dashboard#

The user lands on a main page that introduces the application and provides navigation to each subsystem:

  • “Users”
  • “Items” / “Products”
  • “Reports”
  • Or whatever modules the original Multi-System design included.

2. Navigating to a System#

Choosing a system (for example, Users) routes to:

  • /users – a list of users (often with pagination or filters)
  • Options to:
    • Add a new user
    • Edit an existing user
    • Remove a user

The underlying route might:

  • Query the data source
  • Pass a list of records into a template
  • Render an HTML table with actions

3. Creating and Editing Data#

Forms are central to any management system. A typical flow:

  1. The user visits /users/create:
    • GET request: Flask returns an HTML form via a template.
  2. The user submits the form:
    • POST request: Flask route validates the input and:
      • Saves the data (e.g., in a database).
      • Redirects back (/users) or to a detail page, often with a success message.

This read–create–update–delete (CRUD) pattern repeats across all systems in the app, giving a consistent and predictable user experience.

4. Feedback and Validation#

Flask’s features, such as flash() messages, make it easy to inform the user when:

  • A record has been successfully created or updated
  • Validation fails (e.g., missing fields or invalid formats)
  • An operation (like deletion) completed

The result is an app that feels coherent and professional, even as it was built first and foremost as a learning exercise.


Configuration and Dependencies#

Although lightweight, the project leverages standard Flask practices:

  • requirements.txt (or similar) listing dependencies like:
    • Flask
    • Potentially Jinja2Flask-LoginSQLAlchemy, etc.
  • A configuration block or file that sets:
    • Debug mode
    • Secret key (for sessions)
    • Database URI, if a DB is used

This level of structure makes it straightforward to:

  • Set up the project on another machine
  • Understand how the app should be run (flask run or python app.py)
  • Extend configuration for different environments, if needed

Lessons Learned from the Migration#

Rebuilding the Multi-System PHP app in Flask was more than just rewriting code. It highlighted several important lessons:

  1. Language changes, architecture remains
    Concepts like routing, templates, and data models exist in both PHP and Python — they just look different syntactically. The underlying ideas are portable.

  2. Frameworks impose useful structure
    Flask encouraged me to think in terms of explicit routes, view functions, and reusable templates. That structure makes the application easier to navigate and reason about.

  3. Separation of concerns is powerful
    Pulling business logic out of templates and into Python functions clarified what each part of the codebase was responsible for.

  4. Migration deepens understanding
    To port the project, I had to thoroughly understand the original PHP version — every form, every flow, every data interaction. That process alone was valuable.

  5. Python + Flask are excellent for teaching and experimentation
    Flask’s minimalism and Python’s readability make them a great combination for educational and prototype projects like this.


Conclusion#

The Multi-System_Flask-App project represents a concrete step in evolving a multi-feature web application from PHP to Python, using Flask as a modern, lightweight framework.

While the application itself is relatively small and focused on educational value, it demonstrates several important skills:

  • Understanding an existing system and its requirements
  • Translating features across languages and frameworks
  • Designing clear routes and templates
  • Building a modular web application rather than isolated scripts

For anyone considering a similar migration — whether from PHP, another framework, or even a collection of scripts — this kind of project is an excellent way to deepen your understanding of web architecture while gaining confidence in a new stack.

If you’re interested in the code or want to build on this idea, you can explore the repository here:

Multi-System_Flask-App on GitHub


References#

My Flask Project that contains Multiple Apps
https://michael679089.github.io/Michael679089/posts/my-flask-project-that-contains-multiple-apps/
Author
Michael Jacob M. Delos Santos
Published at
2026-02-13
License
CC BY-NC-SA 4.0