prompt_template/web/serve.py

78 lines
2.6 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
Minimaler Entwicklungs-Server für die Prompt Templates Webansicht.
Startet auf Port 8080 und dient die statischen Dateien aus.
"""
import http.server
import socketserver
import os
import socket
import json
DIRECTORY = os.path.dirname(os.path.abspath(__file__))
ROOT_DIR = os.path.abspath(os.path.join(DIRECTORY, '..'))
def find_free_port(start_port=9000):
"""Finde einen freien Port ab start_port"""
port = start_port
while port < 10000:
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', port))
return port
except OSError:
port += 1
return None
class Handler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=DIRECTORY, **kwargs)
def do_GET(self):
# Für Root-Pfad: index.html servieren
if self.path == '/' or self.path == '/index.html':
self.path = '/index.html'
return super().do_GET()
# Anfragen für /templates.json oder /templates/* umleiten
if self.path.startswith('/templates'):
# Pfad relativ zur ROOT_DIR konstruieren
rel_path = self.path[1:] # '/templates.json' → 'templates.json'
file_path = os.path.join(ROOT_DIR, rel_path)
if os.path.exists(file_path) and not os.path.isdir(file_path):
try:
self.path = file_path
# Einfach die Datei senden
with open(file_path, 'rb') as f:
self.send_response(200)
self.send_header('Content-type', 'text/plain' if file_path.endswith('.md') else 'application/json')
self.end_headers()
self.wfile.write(f.read())
return
except Exception as e:
self.send_error(500, f"Error serving file: {e}")
return
else:
self.send_error(404, "File not found")
return
return super().do_GET()
def main():
PORT = 8081
print(f"Serving on http://localhost:{PORT}")
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print(f"Serving Prompt Templates on http://localhost:{PORT}")
print(f"Press Ctrl+C to stop")
print(f"Directory: {DIRECTORY}")
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\nServer stopped")
if __name__ == "__main__":
main()