Files
shopback/run_spa_server.py
Beyhan Oğur d9f1ea341e first commit
2026-04-26 22:27:56 +03:00

218 lines
6.8 KiB
Python
Raw Permalink 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.
#!/usr/bin/env python3
"""
Simple HTTP server to serve SPA test page on port 3000
This simulates a Nuxt/Next.js frontend
"""
import http.server
import socketserver
import os
from urllib.parse import urlparse, parse_qs
import json
PORT = 3001 # Using 3001 since 3000 might be in use
class SPAHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
# Parse URL
parsed = urlparse(self.path)
path = parsed.path
# Serve activation page
if path.startswith('/activate/'):
parts = path.split('/')
if len(parts) >= 4:
uid = parts[2]
token = parts[3]
self.serve_activation_page(uid, token)
return
# Serve main SPA page
if path == '/' or path == '/index.html':
self.serve_spa_page()
return
# Default handler
super().do_GET()
def serve_spa_page(self):
"""Serve the main SPA page"""
html = """
<!DOCTYPE html>
<html>
<head>
<title>Frontend SPA (Port 3000)</title>
<style>
body {
font-family: sans-serif;
max-width: 600px;
margin: 50px auto;
padding: 20px;
background: #f5f5f5;
}
.card {
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
h1 { color: #333; }
.info { background: #e7f3ff; padding: 15px; border-radius: 5px; margin: 20px 0; }
a { color: #667eea; text-decoration: none; font-weight: bold; }
</style>
</head>
<body>
<div class="card">
<h1>🎉 Frontend SPA (Port 3000)</h1>
<p>Bu sayfa Nuxt/Next.js frontend'inizi simüle ediyor.</p>
<div class="info">
<strong>✅ Email activation linkleri buraya gelecek!</strong>
<p>Format: <code>http://localhost:3000/activate/{uid}/{token}/</code></p>
</div>
<h3>Test için:</h3>
<ul>
<li>Backend'de user oluşturun</li>
<li>MailPit'te email'i açın</li>
<li>Activation link'e tıklayın</li>
<li>Bu sayfaya gelecek ve otomatik activate edecek!</li>
</ul>
<p><a href="http://localhost:8000/api/v1/spa/">Backend SPA Test (Port 8000)</a></p>
</div>
</body>
</html>
"""
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(html.encode())
def serve_activation_page(self, uid, token):
"""Serve activation page that calls Django API"""
html = f"""
<!DOCTYPE html>
<html>
<head>
<title>Activating Account...</title>
<style>
body {{
font-family: sans-serif;
max-width: 600px;
margin: 50px auto;
padding: 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}}
.card {{
background: white;
padding: 40px;
border-radius: 20px;
box-shadow: 0 20px 60px rgba(0,0,0,0.3);
text-align: center;
}}
.spinner {{
border: 4px solid #f3f3f3;
border-top: 4px solid #667eea;
border-radius: 50%;
width: 60px;
height: 60px;
animation: spin 1s linear infinite;
margin: 0 auto 20px;
}}
@keyframes spin {{
0% {{ transform: rotate(0deg); }}
100% {{ transform: rotate(360deg); }}
}}
.success {{ display: none; color: #28a745; }}
.error {{ display: none; color: #dc3545; }}
.icon {{ font-size: 64px; margin-bottom: 20px; }}
.btn {{
display: inline-block;
padding: 12px 30px;
background: #667eea;
color: white;
text-decoration: none;
border-radius: 8px;
margin-top: 20px;
}}
</style>
</head>
<body>
<div class="card">
<div id="loading">
<div class="spinner"></div>
<h1>Activating Your Account...</h1>
<p>Please wait...</p>
</div>
<div id="success" class="success">
<div class="icon">✅</div>
<h1>Account Activated!</h1>
<p>Your account has been successfully activated.</p>
<a href="http://localhost:8000/api/v1/spa/" class="btn">Go to Login</a>
</div>
<div id="error" class="error">
<div class="icon">❌</div>
<h1>Activation Failed</h1>
<p id="errorMsg">Something went wrong.</p>
<a href="http://localhost:8000/api/v1/spa/" class="btn">Back to Login</a>
</div>
</div>
<script>
const uid = '{uid}';
const token = '{token}';
console.log('Frontend (port 3000) - Activating:', {{ uid, token }});
// Call Django backend API
fetch('http://localhost:8000/api/v1/auth/users/activation/', {{
method: 'POST',
headers: {{
'Content-Type': 'application/json',
}},
body: JSON.stringify({{ uid, token }})
}})
.then(response => {{
console.log('Backend response status:', response.status);
document.getElementById('loading').style.display = 'none';
if (response.ok || response.status === 204) {{
document.getElementById('success').style.display = 'block';
console.log('✅ Activation successful!');
}} else {{
return response.json().then(data => {{
throw new Error(data.detail || data.token?.[0] || 'Activation failed');
}});
}}
}})
.catch(error => {{
console.error('Activation error:', error);
document.getElementById('loading').style.display = 'none';
document.getElementById('error').style.display = 'block';
document.getElementById('errorMsg').textContent = error.message;
}});
</script>
</body>
</html>
"""
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(html.encode())
os.chdir('/home/beyhan/Python/server')
with socketserver.TCPServer(("", PORT), SPAHandler) as httpd:
print(f"🚀 Frontend SPA Server running on http://localhost:{PORT}")
print(f"📧 Email activation links will work here!")
print(f"🔗 Open: http://localhost:{PORT}")
print(f"\nPress Ctrl+C to stop")
httpd.serve_forever()