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 .blueprints import tasks_blueprint
from .errors import register_error_handlers
from .models import db
# Determine if we're in production
@@ -90,27 +91,7 @@ def create_app(config_name: Optional[str] = None) -> Flask:
csrf.exempt('tasks.health_check')
# Register error handlers
@app.errorhandler(400)
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_error_handlers(app)
# Register blueprints
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."""
from datetime import datetime, timezone
from typing import Dict, Any, List
from typing import Dict, Any
from flask_sqlalchemy import SQLAlchemy