import os
import platform
import time
from flask import Flask, render_template_string, jsonify, request
app = Flask(__name__)
# --- 配置区 ---
app.config['SECRET_KEY'] = 'dev-secret-key-12345'
messages = [{"id": 1, "text": "系统已上线,等待指令...", "time": "2023-10-01 12:00:00"}]
# --- HTML 模板 (单页应用的核心) ---
HTML_TEMPLATE = """
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask 部署测试工具</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body { background-color: #f8f9fa; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
.stats-card { border-left: 5px solid #0d6efd; }
.log-container { height: 200px; overflow-y: auto; background: #212529; color: #0dfd0d; padding: 15px; border-radius: 5px; font-family: monospace; }
</style>
</head>
<body>
<div class="container py-5">
<header class="pb-3 mb-4 border-bottom">
<span class="fs-4">🚀 Flask 自动化部署测试面板</span>
</header>
<div class="row g-4">
<div class="col-md-4">
<div class="card h-100 stats-card shadow-sm">
<div class="card-body">
<h5 class="card-title">服务器信息</h5>
<p class="card-text"><strong>OS:</strong> {{ info.os }}</p>
<p class="card-text"><strong>Python:</strong> {{ info.py_ver }}</p>
<p class="card-text"><strong>运行状态:</strong> <span class="badge bg-success">正常</span></p>
<p class="card-text text-muted small">最后更新: {{ info.now }}</p>
</div>
</div>
</div>
<div class="col-md-8">
<div class="card shadow-sm">
<div class="card-header bg-white">发送测试消息</div>
<div class="card-body">
<div class="input-group mb-3">
<input type="text" id="msgInput" class="form-control" placeholder="输入测试内容...">
<button class="btn btn-primary" onclick="sendMessage()">发送数据</button>
</div>
<div id="logBox" class="log-container">
{% for m in messages %}
<div>[{{ m.time }}] {{ m.text }}</div>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
<footer class="pt-3 mt-4 text-muted border-top">
© 2023-2025 Flask Test App | Environment: {{ info.env }}
</footer>
</div>
<script>
async function sendMessage() {
const input = document.getElementById('msgInput');
const logBox = document.getElementById('logBox');
if (!input.value) return;
const response = await fetch('/api/send', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({text: input.value})
});
const data = await response.json();
if (data.status === 'success') {
const div = document.createElement('div');
div.textContent = `[${data.entry.time}] ${data.entry.text}`;
logBox.prepend(div);
input.value = '';
}
}
</script>
</body>
</html>
"""
# --- 路由逻辑 ---
@app.route('/')
def index():
# 获取系统基本信息
info = {
"os": f"{platform.system()} {platform.release()}",
"py_ver": platform.python_version(),
"now": time.strftime("%Y-%m-%d %H:%M:%S"),
"env": os.getenv('FLASK_ENV', 'Production')
}
return render_template_string(HTML_TEMPLATE, info=info, messages=reversed(messages))
@app.route('/api/send', methods=['POST'])
def handle_api():
data = request.json
new_entry = {
"id": len(messages) + 1,
"text": data.get('text', 'Empty'),
"time": time.strftime("%H:%M:%S")
}
messages.append(new_entry)
# 保持列表长度,防止内存溢出
if len(messages) > 10: messages.pop(0)
return jsonify({"status": "success", "entry": new_entry})
@app.route('/health')
def health_check():
"""用于云平台健康检查的接口"""
return jsonify({"status": "up", "timestamp": time.time()})
@app.errorhandler(404)
def page_not_found(e):
return "<h1>404</h1><p>该页面不存在,请检查部署路径。</p>", 404
if __name__ == '__main__':
# 生产环境建议使用 Gunicorn 启动,本地测试用此命令
app.run(host='0.0.0.0', port=5000)
版权归属:
Administrator
许可协议:
本文使用《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》协议授权
评论区