| from functools import wraps |
| from flask import request, jsonify |
| from typing import Callable, Type |
| from marshmallow import Schema, ValidationError |
|
|
| def validate_input(serializer: Type[Schema], partial: bool = False) -> Callable: |
| """ |
| Validates the input data using a Marshmallow serializer. |
| |
| Args: |
| serializer (Type[Schema]): The Marshmallow serializer to use. |
| partial (bool, optional): Whether to allow partial updates. Defaults to False. |
| |
| Returns: |
| Callable: The decorated function. |
| """ |
| def decorator(func): |
| @wraps(func) |
| def wrapper(*args, **kwargs): |
| try: |
| data = request.get_json() |
| if not data: |
| return jsonify({'error': 'No input data provided'}), 400 |
| deserialized_data = serializer().load(data, partial=partial) |
| request.deserialized_data = deserialized_data |
| return func(*args, **kwargs) |
| except ValidationError as e: |
| return jsonify({'error': str(e)}), 400 |
| except Exception as e: |
| return jsonify({'error': 'Invalid input data'}), 400 |
| return wrapper |
| return decorator |
|
|