-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
135 lines (117 loc) · 4.19 KB
/
app.py
File metadata and controls
135 lines (117 loc) · 4.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
from flask import Flask, request, jsonify
import logging
import os
from datetime import datetime
# Create logs directory if it doesn't exist
os.makedirs('logs', exist_ok=True)
# Configure logging to write to both console and file
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(funcName)s - %(message)s',
handlers=[
logging.FileHandler('logs/division_api.log'),
logging.StreamHandler() # This keeps console logging
]
)
logger = logging.getLogger(__name__)
app = Flask(__name__)
@app.route('/divide', methods=['POST'])
def divide_numbers():
"""
POST API endpoint that divides two numbers.
Expected JSON payload:
{
"numerator": <first_number>,
"denominator": <second_number>
}
Returns:
{
"result": <division_result>,
"numerator": <first_number>,
"denominator": <second_number>
}
"""
try:
# Get JSON data from request
data = request.get_json()
if not data:
logger.warning("No JSON data provided in request")
return jsonify({
"error": "No JSON data provided",
"message": "Please provide numerator and denominator in JSON format"
}), 400
# Extract numerator and denominator
numerator = data.get('numerator')
denominator = data.get('denominator')
# Validate input
if numerator is None or denominator is None:
logger.warning(f"Missing required fields in request: numerator={numerator}, denominator={denominator}")
return jsonify({
"error": "Missing required fields",
"message": "Both 'numerator' and 'denominator' are required"
}), 400
# Check if inputs are numbers
try:
numerator = float(numerator)
denominator = float(denominator)
except (ValueError, TypeError) as e:
logger.warning(f"Invalid input type: numerator={numerator} (type: {type(numerator)}), denominator={denominator} (type: {type(denominator)})")
return jsonify({
"error": "Invalid input type",
"message": "Both numerator and denominator must be numbers"
}), 400
# Perform division
if denominator == 0:
raise ValueError('Division by zero is not allowed')
result = numerator / denominator
# Log the operation
logger.info(f"Division operation: {numerator} / {denominator} = {result}")
# Return result
return jsonify({
"result": result,
"numerator": numerator,
"denominator": denominator
}), 200
except Exception as e:
import traceback
error_traceback = traceback.format_exc()
logger.error(f"Unexpected error: {str(e)}")
logger.error(f"Stack trace:\n{error_traceback}")
return jsonify({
"error": "Internal server error",
"message": "An unexpected error occurred"
}), 500
@app.route('/health', methods=['GET'])
def health_check():
"""Health check endpoint"""
return jsonify({
"status": "healthy",
"message": "Division API is running"
}), 200
@app.route('/', methods=['GET'])
def home():
"""Home endpoint with API documentation"""
return jsonify({
"message": "Division API Server",
"endpoints": {
"POST /divide": "Divide two numbers",
"GET /health": "Health check",
"GET /": "This help message"
},
"usage": {
"POST /divide": {
"description": "Divide numerator by denominator",
"request_body": {
"numerator": "number (required)",
"denominator": "number (required)"
},
"example": {
"numerator": 10,
"denominator": 2
}
}
}
}), 200
if __name__ == '__main__':
logger.info("Starting Division API Server...")
app.run(host='0.0.0.0', port=5000, debug=True)