138 lines
4.1 KiB
Python
138 lines
4.1 KiB
Python
from fastapi import FastAPI
|
|
from fastapi.responses import HTMLResponse
|
|
from fastapi.staticfiles import StaticFiles
|
|
import uvicorn
|
|
import os
|
|
import subprocess
|
|
|
|
app = FastAPI(title="Web Demo Application")
|
|
|
|
# Build MkDocs documentation on startup
|
|
def build_docs():
|
|
docs_dir = os.path.join(os.path.dirname(__file__), "docs")
|
|
site_dir = os.path.join(os.path.dirname(__file__), "site")
|
|
|
|
if os.path.exists(docs_dir):
|
|
try:
|
|
subprocess.run(
|
|
["mkdocs", "build", "-f", os.path.join(docs_dir, "mkdocs.yml"), "-d", site_dir],
|
|
check=True,
|
|
capture_output=True
|
|
)
|
|
print(f"✓ Documentation built successfully at {site_dir}")
|
|
return True
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"✗ Failed to build documentation: {e.stderr.decode()}")
|
|
return False
|
|
except FileNotFoundError:
|
|
print("✗ MkDocs not installed. Install with: pip install mkdocs mkdocs-material")
|
|
return False
|
|
return False
|
|
|
|
# Build docs on startup
|
|
@app.on_event("startup")
|
|
async def startup_event():
|
|
build_docs()
|
|
|
|
# Mount static documentation site at /docs
|
|
site_dir = os.path.join(os.path.dirname(__file__), "site")
|
|
if os.path.exists(site_dir):
|
|
app.mount("/docs", StaticFiles(directory=site_dir, html=True), name="docs")
|
|
|
|
# Simple HTML template inline
|
|
HTML_TEMPLATE = """
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>Web Demo</title>
|
|
<style>
|
|
body {
|
|
font-family: Arial, sans-serif;
|
|
max-width: 800px;
|
|
margin: 50px auto;
|
|
padding: 20px;
|
|
background-color: #f5f5f5;
|
|
}
|
|
.container {
|
|
background-color: white;
|
|
padding: 30px;
|
|
border-radius: 8px;
|
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
}
|
|
h1 {
|
|
color: #333;
|
|
border-bottom: 2px solid #4CAF50;
|
|
padding-bottom: 10px;
|
|
}
|
|
.info-box {
|
|
background-color: #e8f5e9;
|
|
padding: 15px;
|
|
margin: 20px 0;
|
|
border-left: 4px solid #4CAF50;
|
|
border-radius: 4px;
|
|
}
|
|
.metric {
|
|
display: inline-block;
|
|
margin: 10px 20px 10px 0;
|
|
padding: 10px 20px;
|
|
background-color: #2196F3;
|
|
color: white;
|
|
border-radius: 4px;
|
|
}
|
|
.doc-link {
|
|
display: inline-block;
|
|
margin: 20px 10px 0 0;
|
|
padding: 12px 24px;
|
|
background-color: #673AB7;
|
|
color: white;
|
|
text-decoration: none;
|
|
border-radius: 4px;
|
|
transition: background-color 0.3s;
|
|
}
|
|
.doc-link:hover {
|
|
background-color: #512DA8;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<h1>Welcome to Web Demo Application</h1>
|
|
<div class="info-box">
|
|
<h2>Application Information</h2>
|
|
<p><strong>Service:</strong> Web Frontend</p>
|
|
<p><strong>Status:</strong> ✓ Running</p>
|
|
<p><strong>Version:</strong> 1.0.0</p>
|
|
</div>
|
|
<h2>Metrics Dashboard</h2>
|
|
<div>
|
|
<span class="metric">Requests: 1,234</span>
|
|
<span class="metric">Uptime: 99.9%</span>
|
|
<span class="metric">Users: 567</span>
|
|
</div>
|
|
<div class="info-box">
|
|
<h3>About</h3>
|
|
<p>This is a demo FastAPI web application serving HTML content.
|
|
It demonstrates a simple web interface with metrics and information display.</p>
|
|
</div>
|
|
<div>
|
|
<a href="/docs/" class="doc-link">📚 View Documentation</a>
|
|
<a href="/health" class="doc-link">🏥 Health Check</a>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
"""
|
|
|
|
@app.get("/", response_class=HTMLResponse)
|
|
async def root():
|
|
"""Serve the main webpage"""
|
|
return HTML_TEMPLATE
|
|
|
|
@app.get("/health")
|
|
async def health():
|
|
"""Health check endpoint"""
|
|
return {"status": "healthy", "service": "web"}
|
|
|
|
if __name__ == "__main__":
|
|
uvicorn.run(app, host="0.0.0.0", port=8000)
|