Files
2025-06-08 15:53:25 +00:00

79 lines
2.3 KiB
Python

"""
Flask application factory and setup.
"""
from flask import Flask
from flask_cors import CORS
from .config import Config
from .utils.logger import get_logger
from .utils.error_handler import setup_error_handlers
# Import controllers
from .controllers.system_controller import system_bp
from .controllers.sensors_controller import sensors_bp
from .controllers.timers_controller import timers_bp
from .controllers.outputs_controller import outputs_bp
from .controllers.dts_controller import dts_bp
logger = get_logger(__name__)
def create_app(config_object=None):
"""
Application factory pattern for creating Flask app.
Args:
config_object: Configuration class or object to use
Returns:
Flask: Configured Flask application
"""
app = Flask(__name__)
# Configure the app
if config_object is None:
config_object = Config
app.config.from_object(config_object)
# Enable CORS for web-based control panels
if config_object.CORS_ENABLED:
CORS(app)
logger.info("CORS enabled for web applications")
# Setup error handlers
setup_error_handlers(app)
# Register blueprints
register_blueprints(app)
# Log application startup
logger.info(f"Flask application created")
logger.info(f"Debug mode: {app.config.get('DEBUG', False)}")
logger.info(f"PLC target: {config_object.PLC_IP}:{config_object.PLC_PORT}")
return app
def register_blueprints(app):
"""Register all route blueprints with the Flask app"""
# System and status endpoints
app.register_blueprint(system_bp, url_prefix='/api')
# Data monitoring endpoints
app.register_blueprint(sensors_bp, url_prefix='/api')
app.register_blueprint(timers_bp, url_prefix='/api')
app.register_blueprint(outputs_bp, url_prefix='/api')
# Control endpoints
app.register_blueprint(dts_bp, url_prefix='/api')
logger.info("All blueprints registered successfully")
# Log registered routes
if app.config.get('DEBUG', False):
logger.debug("Registered routes:")
for rule in app.url_map.iter_rules():
methods = ','.join(rule.methods - {'OPTIONS', 'HEAD'})
logger.debug(f" {rule.rule} [{methods}] -> {rule.endpoint}")