RAG5_2_ChooseLLM / app /app_device_routes.py
jeongsoo's picture
Succeed:local server control!2
7cef4b0
"""
RAG ๊ฒ€์ƒ‰ ์ฑ—๋ด‡ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์žฅ์น˜ ๊ด€๋ฆฌ API ๋ผ์šฐํŠธ ์ •์˜ (API ๊ฒฝ๋กœ ์ˆ˜์ •๋จ)
"""
import logging
import requests
from flask import request, jsonify
# ๋กœ๊ฑฐ ๊ฐ€์ ธ์˜ค๊ธฐ
logger = logging.getLogger(__name__)
def register_device_routes(app, login_required, DEVICE_SERVER_URL):
"""Flask ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žฅ์น˜ ๊ด€๋ฆฌ ๊ด€๋ จ ๋ผ์šฐํŠธ ๋“ฑ๋ก"""
# ์‚ฌ์šฉ์ž ์ง€์ • ์žฅ์น˜ ์„œ๋ฒ„ URL ๋ณ€์ˆ˜
custom_device_url = None
# URL ์„ค์ • ํ•จ์ˆ˜
def get_device_url():
# ์‚ฌ์šฉ์ž ์ง€์ • URL์ด ์žˆ์œผ๋ฉด ์‚ฌ์šฉ, ์—†์œผ๋ฉด ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’ ์‚ฌ์šฉ
return custom_device_url or DEVICE_SERVER_URL
@app.route('/api/device/connect', methods=['POST'])
@login_required
def connect_device_server():
"""์‚ฌ์šฉ์ž ์ง€์ • ์žฅ์น˜ ์„œ๋ฒ„ URL ์—ฐ๊ฒฐ API"""
nonlocal custom_device_url # ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜ ์ฐธ์กฐ
try:
# ์š”์ฒญ์—์„œ URL ๊ฐ€์ ธ์˜ค๊ธฐ
request_data = request.get_json()
if not request_data or 'url' not in request_data:
logger.error("URL์ด ์ œ๊ณต๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
return jsonify({
"success": False,
"error": "URL์ด ์ œ๊ณต๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
}), 400 # Bad Request
new_url = request_data['url'].strip()
if not new_url:
logger.error("URL์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.")
return jsonify({
"success": False,
"error": "URL์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค."
}), 400 # Bad Request
# URL ์„ค์ •
logger.info(f"์‚ฌ์šฉ์ž ์ง€์ • ์žฅ์น˜ ์„œ๋ฒ„ URL ์„ค์ •: {new_url}")
custom_device_url = new_url
# ์„ค์ •๋œ URL๋กœ ์ƒํƒœ ํ™•์ธ ์‹œ๋„
try:
api_path = "/api/status"
logger.info(f"์žฅ์น˜ ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ ์š”์ฒญ: {custom_device_url}{api_path}")
response = requests.get(f"{custom_device_url}{api_path}", timeout=5)
if response.status_code == 200:
try:
data = response.json()
logger.info(f"์‚ฌ์šฉ์ž ์ง€์ • ์žฅ์น˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์„ฑ๊ณต. ์‘๋‹ต ๋ฐ์ดํ„ฐ: {data}")
return jsonify({
"success": True,
"message": "์žฅ์น˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ์— ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.",
"server_status": data.get("status", "์ •์ƒ")
})
except requests.exceptions.JSONDecodeError:
logger.error("์žฅ์น˜ ์„œ๋ฒ„ ์‘๋‹ต JSON ํŒŒ์‹ฑ ์‹คํŒจ")
return jsonify({
"success": False,
"error": "์žฅ์น˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์œ ํšจํ•˜์ง€ ์•Š์€ JSON ์‘๋‹ต์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค."
}), 502 # Bad Gateway
else:
error_message = f"์žฅ์น˜ ์„œ๋ฒ„ ์‘๋‹ต ์˜ค๋ฅ˜: {response.status_code}"
try:
error_detail = response.json().get("error", response.text)
error_message += f" - {error_detail}"
except Exception:
error_message += f" - {response.text}"
logger.warning(error_message)
custom_device_url = None # ์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ URL ์ดˆ๊ธฐํ™”
return jsonify({
"success": False,
"error": error_message
}), 502 # Bad Gateway
except requests.exceptions.Timeout:
logger.error(f"์žฅ์น˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ํƒ€์ž„์•„์›ƒ ({custom_device_url})")
custom_device_url = None # ์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ URL ์ดˆ๊ธฐํ™”
return jsonify({
"success": False,
"error": "์žฅ์น˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ํƒ€์ž„์•„์›ƒ. ์„œ๋ฒ„ ์‘๋‹ต์ด ๋„ˆ๋ฌด ๋А๋ฆฝ๋‹ˆ๋‹ค."
}), 504 # Gateway Timeout
except requests.exceptions.ConnectionError:
logger.error(f"์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹คํŒจ ({custom_device_url})")
custom_device_url = None # ์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ URL ์ดˆ๊ธฐํ™”
return jsonify({
"success": False,
"error": "์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€, URL์ด ์ •ํ™•ํ•œ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
}), 502 # Bad Gateway
except Exception as e:
logger.error(f"์žฅ์น˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์ค‘ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}", exc_info=True)
custom_device_url = None # ์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ URL ์ดˆ๊ธฐํ™”
return jsonify({
"success": False,
"error": f"์žฅ์น˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
}), 500 # Internal Server Error
except Exception as e:
logger.error(f"/api/device/connect ์ฒ˜๋ฆฌ ์ค‘ ๋‚ด๋ถ€ ์„œ๋ฒ„ ์˜ค๋ฅ˜: {e}", exc_info=True)
return jsonify({
"success": False,
"error": f"๋‚ด๋ถ€ ์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
}), 500 # Internal Server Error
@app.route('/api/device/status', methods=['GET'])
@login_required
def device_status():
"""์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” API ์—”๋“œํฌ์ธํŠธ"""
try:
# requests ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ž„ํฌํŠธํ•  ํ•„์š” ์—†์Œ (์ƒ๋‹จ ์ž„ํฌํŠธ ์‚ฌ์šฉ)
# json, jsonify๋„ Flask์—์„œ ์ด๋ฏธ ์ž„ํฌํŠธ๋จ (์ƒ๋‹จ ์ž„ํฌํŠธ ์‚ฌ์šฉ)
# ์—ฐ๊ฒฐ ํƒ€์ž„์•„์›ƒ ์„ค์ •
timeout = 5 # 5์ดˆ๋กœ ํƒ€์ž„์•„์›ƒ ์„ค์ •
try:
# ์žฅ์น˜ ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ - ๊ฒฝ๋กœ: /api/status
current_device_url = get_device_url()
api_path = "/api/status"
logger.info(f"์žฅ์น˜ ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ ์š”์ฒญ: {current_device_url}{api_path}")
response = requests.get(f"{current_device_url}{api_path}", timeout=timeout)
# ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ ๋ฐ ๋‚ด์šฉ ๋กœ๊น… (๋””๋ฒ„๊น… ๊ฐ•ํ™”)
logger.debug(f"์žฅ์น˜ ์„œ๋ฒ„ ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ: {response.status_code}")
try:
logger.debug(f"์žฅ์น˜ ์„œ๋ฒ„ ์‘๋‹ต ๋‚ด์šฉ: {response.text[:200]}...") # ๋„ˆ๋ฌด ๊ธธ๋ฉด ์ž˜๋ผ์„œ ๋กœ๊น…
except Exception:
logger.debug("์žฅ์น˜ ์„œ๋ฒ„ ์‘๋‹ต ๋‚ด์šฉ ๋กœ๊น… ์‹คํŒจ (ํ…์ŠคํŠธ ํ˜•์‹ ์•„๋‹˜?)")
if response.status_code == 200:
# ์„ฑ๊ณต ์‹œ ์‘๋‹ต ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํ™•์ธ ๋ฐ ๋กœ๊น…
try:
data = response.json()
logger.info(f"์žฅ์น˜ ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ ์„ฑ๊ณต. ์‘๋‹ต ๋ฐ์ดํ„ฐ: {data}")
return jsonify({"success": True, "status": "connected", "data": data})
except requests.exceptions.JSONDecodeError:
logger.error("์žฅ์น˜ ์„œ๋ฒ„ ์‘๋‹ต JSON ํŒŒ์‹ฑ ์‹คํŒจ")
return jsonify({
"success": False,
"error": "์žฅ์น˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์œ ํšจํ•˜์ง€ ์•Š์€ JSON ์‘๋‹ต์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค."
}), 502 # Bad Gateway (์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„ ์˜ค๋ฅ˜)
else:
# ์‹คํŒจ ์‹œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ํฌํ•จ ๋กœ๊น…
error_message = f"์žฅ์น˜ ์„œ๋ฒ„ ์‘๋‹ต ์˜ค๋ฅ˜: {response.status_code}"
try:
# ์„œ๋ฒ„์—์„œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ json์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ ํฌํ•จ
error_detail = response.json().get("error", response.text)
error_message += f" - {error_detail}"
except Exception:
error_message += f" - {response.text}" # JSON ํŒŒ์‹ฑ ์‹คํŒจ ์‹œ ์›๋ณธ ํ…์ŠคํŠธ
logger.warning(error_message) # ๊ฒฝ๊ณ  ๋ ˆ๋ฒจ๋กœ ๋กœ๊น…
return jsonify({
"success": False,
"error": error_message
}), 502 # Bad Gateway
except requests.exceptions.Timeout:
logger.error(f"์žฅ์น˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ํƒ€์ž„์•„์›ƒ ({DEVICE_SERVER_URL})")
return jsonify({
"success": False,
"error": "์žฅ์น˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ํƒ€์ž„์•„์›ƒ. ์„œ๋ฒ„ ์‘๋‹ต์ด ๋„ˆ๋ฌด ๋А๋ฆฝ๋‹ˆ๋‹ค."
}), 504 # Gateway Timeout
except requests.exceptions.ConnectionError:
current_device_url = get_device_url()
logger.error(f"์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹คํŒจ ({current_device_url})")
return jsonify({
"success": False,
"error": "์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€, URL์ด ์ •ํ™•ํ•œ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
}), 502 # Bad Gateway (์—ฐ๊ฒฐ ์‹คํŒจ๋„ ์—…์ŠคํŠธ๋ฆผ ๋ฌธ์ œ๋กœ ๊ฐ„์ฃผ)
except Exception as e:
logger.error(f"์žฅ์น˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์ค‘ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}", exc_info=True) # ์ƒ์„ธ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค ๋กœ๊น…
return jsonify({
"success": False,
"error": f"์žฅ์น˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
}), 500 # Internal Server Error (Flask ์•ฑ ๋‚ด๋ถ€ ๋˜๋Š” requests ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์ œ ๊ฐ€๋Šฅ์„ฑ)
except Exception as e:
# ์ด try-except ๋ธ”๋ก์€ /api/device/status ๋ผ์šฐํŠธ ์ž์ฒด์˜ ๋‚ด๋ถ€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ
logger.error(f"/api/device/status ์ฒ˜๋ฆฌ ์ค‘ ๋‚ด๋ถ€ ์„œ๋ฒ„ ์˜ค๋ฅ˜: {e}", exc_info=True)
return jsonify({
"success": False,
"error": f"๋‚ด๋ถ€ ์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
}), 500 # Internal Server Error
@app.route('/api/device/list', methods=['GET'])
@login_required
def device_list():
"""์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ API"""
logger.info("์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์š”์ฒญ")
try:
current_device_url = get_device_url()
api_path = "/api/devices"
logger.info(f"์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์š”์ฒญ: {current_device_url}{api_path}")
response = requests.get(f"{current_device_url}{api_path}", timeout=5)
logger.debug(f"์žฅ์น˜ ๋ชฉ๋ก ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ: {response.status_code}")
if response.status_code == 200:
try:
data = response.json()
devices = data.get("devices", [])
logger.info(f"์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์„ฑ๊ณต: {len(devices)}๊ฐœ ์žฅ์น˜")
return jsonify({
"success": True,
"devices": devices
})
except requests.exceptions.JSONDecodeError:
logger.error("์žฅ์น˜ ๋ชฉ๋ก ์‘๋‹ต JSON ํŒŒ์‹ฑ ์‹คํŒจ")
return jsonify({"success": False, "error": "์žฅ์น˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์œ ํšจํ•˜์ง€ ์•Š์€ JSON ์‘๋‹ต"}), 502
else:
error_message = f"์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์‹คํŒจ: {response.status_code}"
try: error_message += f" - {response.json().get('error', response.text)}"
except Exception: error_message += f" - {response.text}"
logger.warning(error_message)
return jsonify({
"success": False,
"error": error_message
}), 502
except requests.exceptions.Timeout:
logger.error("์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์‹œ๊ฐ„ ์ดˆ๊ณผ")
return jsonify({
"success": False,
"error": "์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."
}), 504
except requests.exceptions.ConnectionError:
logger.error("์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹คํŒจ")
return jsonify({
"success": False,
"error": "์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
}), 503 # Service Unavailable
except Exception as e:
logger.error(f"์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}", exc_info=True)
return jsonify({
"success": False,
"error": f"์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
}), 500
@app.route('/api/device/programs', methods=['GET'])
@login_required
def device_programs():
"""์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ API"""
logger.info("ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ ์š”์ฒญ")
try:
current_device_url = get_device_url()
api_path = "/api/programs"
logger.info(f"ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ ์š”์ฒญ: {current_device_url}{api_path}")
response = requests.get(f"{current_device_url}{api_path}", timeout=5)
logger.debug(f"ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ: {response.status_code}")
if response.status_code == 200:
try:
data = response.json()
programs = data.get("programs", [])
logger.info(f"ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ ์„ฑ๊ณต: {len(programs)}๊ฐœ ํ”„๋กœ๊ทธ๋žจ")
return jsonify({
"success": True,
"programs": programs
})
except requests.exceptions.JSONDecodeError:
logger.error("ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์‘๋‹ต JSON ํŒŒ์‹ฑ ์‹คํŒจ")
return jsonify({"success": False, "error": "์žฅ์น˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์œ ํšจํ•˜์ง€ ์•Š์€ JSON ์‘๋‹ต"}), 502
else:
error_message = f"ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ ์‹คํŒจ: {response.status_code}"
try: error_message += f" - {response.json().get('error', response.text)}"
except Exception: error_message += f" - {response.text}"
logger.warning(error_message)
return jsonify({
"success": False,
"error": error_message
}), 502
except requests.exceptions.Timeout:
logger.error("ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ ์‹œ๊ฐ„ ์ดˆ๊ณผ")
return jsonify({
"success": False,
"error": "ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."
}), 504
except requests.exceptions.ConnectionError:
logger.error("์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹คํŒจ")
return jsonify({
"success": False,
"error": "์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
}), 503
except Exception as e:
logger.error(f"ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}", exc_info=True)
return jsonify({
"success": False,
"error": f"ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
}), 500
@app.route('/api/device/programs/<program_id>/execute', methods=['POST'])
@login_required
def execute_program(program_id):
"""ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ API"""
logger.info(f"ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์š”์ฒญ: {program_id}")
try:
current_device_url = get_device_url()
api_path = f"/api/programs/{program_id}/execute"
logger.info(f"ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์š”์ฒญ: {current_device_url}{api_path}")
response = requests.post(
f"{current_device_url}{api_path}",
json={}, # ํ•„์š”์‹œ ์—ฌ๊ธฐ์— ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
timeout=10 # ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์—๋Š” ๋” ๊ธด ์‹œ๊ฐ„ ๋ถ€์—ฌ
)
logger.debug(f"ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ: {response.status_code}")
if response.status_code == 200:
try:
data = response.json()
success = data.get("success", False)
message = data.get("message", "")
logger.info(f"ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‘๋‹ต: {success}, {message}")
return jsonify(data) # ์„œ๋ฒ„ ์‘๋‹ต ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
except requests.exceptions.JSONDecodeError:
logger.error("ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‘๋‹ต JSON ํŒŒ์‹ฑ ์‹คํŒจ")
# ์„ฑ๊ณต(200)ํ–ˆ์ง€๋งŒ ์‘๋‹ต์ด ๋น„์ •์ƒ์ ์ธ ๊ฒฝ์šฐ
return jsonify({
"success": False, # ํŒŒ์‹ฑ ์‹คํŒจํ–ˆ์œผ๋ฏ€๋กœ False๋กœ ๊ฐ„์ฃผ
"error": "ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์œ ํšจํ•˜์ง€ ์•Š์€ JSON ์‘๋‹ต"
}), 502
else:
error_message = f"ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์š”์ฒญ ์‹คํŒจ: {response.status_code}"
try: error_message += f" - {response.json().get('error', response.text)}"
except Exception: error_message += f" - {response.text}"
logger.warning(error_message)
return jsonify({
"success": False,
"error": error_message
}), 502 # ๋˜๋Š” response.status_code ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ ค
except requests.exceptions.Timeout:
logger.error("ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์š”์ฒญ ์‹œ๊ฐ„ ์ดˆ๊ณผ")
return jsonify({
"success": False,
"error": "ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์š”์ฒญ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."
}), 504
except requests.exceptions.ConnectionError:
logger.error("์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹คํŒจ")
return jsonify({
"success": False,
"error": "์žฅ์น˜ ๊ด€๋ฆฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
}), 503
except Exception as e:
logger.error(f"ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}", exc_info=True)
return jsonify({
"success": False,
"error": f"ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
}), 500