Files
ewoooc/routes/misc_routes.py
ogt c839ac3eff
Some checks failed
CD Pipeline / deploy (push) Has been cancelled
feat(security): automate governance review and access controls
2026-07-10 18:49:32 +08:00

71 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""雜項 Routes Blueprint。從 app.py 抽離Phase 3e
收納尚未歸類的小型 routes
- POST /api/test_url測試外部網址連通性
- GET /brand_assets品牌資產庫頁面
"""
import requests
from flask import Blueprint, jsonify, render_template, request
from urllib.parse import urljoin
from auth import login_required
from services.logger_manager import SystemLogger
from utils.security import validate_public_http_url
misc_bp = Blueprint('misc', __name__)
sys_log = SystemLogger('MiscRoutes').get_logger()
@misc_bp.route('/api/test_url', methods=['POST'])
@login_required
def test_url():
"""API: 測試網址是否有效"""
try:
data = request.get_json()
url = data.get('url')
if not url:
return jsonify({"status": "error", "message": "網址不能為空"}), 400
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
current_url = validate_public_http_url(url)
response = None
for _ in range(4):
response = requests.get(
current_url,
headers=headers,
timeout=(3.05, 10),
allow_redirects=False,
stream=True,
)
if response.status_code not in {301, 302, 303, 307, 308}:
break
location = response.headers.get('Location')
response.close()
if not location:
break
current_url = validate_public_http_url(urljoin(current_url, location))
if response is None:
raise ValueError('無法取得網址回應')
status_code = response.status_code
response.close()
if status_code == 200:
return jsonify({"status": "success", "message": f"✅ 連結有效 (Status: 200)"})
else:
return jsonify({"status": "warning", "message": f"⚠️ 連結回應異常 (Status: {status_code})"})
except ValueError as exc:
return jsonify({"status": "error", "message": str(exc)}), 400
except Exception as exc:
sys_log.warning(f"[Misc] [URL_CHECK] 連線失敗 | Error: {exc}")
return jsonify({"status": "error", "message": "連線失敗,請確認網址後再試。"}), 502
@misc_bp.route('/brand_assets')
def brand_assets():
"""顯示品牌資產庫"""
return render_template('brand_assets.html', active_page='brand_assets')