first commit
This commit is contained in:
137
web/main.py
Normal file
137
web/main.py
Normal file
@@ -0,0 +1,137 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user