Compare commits

..

2 Commits

Author SHA1 Message Date
4aa075a7ff refactor: clean imports 2025-11-11 05:31:27 +01:00
5698e1f617 refactor: extract error handlers 2025-11-11 05:31:16 +01:00
3 changed files with 34 additions and 22 deletions

View File

@@ -9,6 +9,7 @@ from flask_wtf.csrf import CSRFProtect, CSRFError
from dotenv import load_dotenv from dotenv import load_dotenv
from .blueprints import tasks_blueprint from .blueprints import tasks_blueprint
from .errors import register_error_handlers
from .models import db from .models import db
# Determine if we're in production # Determine if we're in production
@@ -90,27 +91,7 @@ def create_app(config_name: Optional[str] = None) -> Flask:
csrf.exempt('tasks.health_check') csrf.exempt('tasks.health_check')
# Register error handlers # Register error handlers
@app.errorhandler(400) register_error_handlers(app)
def bad_request(error) -> Tuple[Response, int]:
"""Handle 400 errors with JSON response."""
return jsonify({'error': 'Bad request', 'message': str(error)}), 400
@app.errorhandler(404)
def not_found(error) -> Tuple[Response, int]:
"""Handle 404 errors with JSON response."""
return jsonify({'error': 'Not found', 'message': str(error)}), 404
@app.errorhandler(CSRFError)
def handle_csrf_error(e) -> Tuple[Response, int]:
"""Handle CSRF errors with JSON response."""
app.logger.warning(f'CSRF error: {e}')
return jsonify({'error': 'CSRF token missing or invalid'}), 400
@app.errorhandler(500)
def internal_error(error) -> Tuple[Response, int]:
"""Handle 500 errors with JSON response."""
app.logger.error(f'Server error: {error}')
return jsonify({'error': 'Internal server error'}), 500
# Register blueprints # Register blueprints
app.register_blueprint(tasks_blueprint) app.register_blueprint(tasks_blueprint)

31
flado/errors.py Normal file
View File

@@ -0,0 +1,31 @@
"""Error handlers for Flask application."""
from typing import Tuple
from flask import Flask, jsonify, Response
from flask_wtf.csrf import CSRFError
from werkzeug.exceptions import HTTPException
def register_error_handlers(app: Flask) -> None:
"""Register all error handlers with the Flask app."""
@app.errorhandler(400)
def bad_request(error: HTTPException) -> Tuple[Response, int]:
"""Handle 400 errors with JSON response."""
return jsonify({'error': 'Bad request', 'message': str(error)}), 400
@app.errorhandler(404)
def not_found(error: HTTPException) -> Tuple[Response, int]:
"""Handle 404 errors with JSON response."""
return jsonify({'error': 'Not found', 'message': str(error)}), 404
@app.errorhandler(CSRFError)
def handle_csrf_error(e: CSRFError) -> Tuple[Response, int]:
"""Handle CSRF errors with JSON response."""
app.logger.warning(f'CSRF error: {e}')
return jsonify({'error': 'CSRF token missing or invalid'}), 400
@app.errorhandler(500)
def internal_error(error: Exception) -> Tuple[Response, int]:
"""Handle 500 errors with JSON response."""
app.logger.error(f'Server error: {error}')
return jsonify({'error': 'Internal server error'}), 500

View File

@@ -1,6 +1,6 @@
"""SQLAlchemy models for Flado.""" """SQLAlchemy models for Flado."""
from datetime import datetime, timezone from datetime import datetime, timezone
from typing import Dict, Any, List from typing import Dict, Any
from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import SQLAlchemy