Files
tianxuan/scripts/start_server.py
T

55 lines
1.5 KiB
Python

"""Start the development server with host and port from config.yaml.
All output (stdout + stderr) is redirected to log files so the process
can run in the background without blocking any terminal.
"""
import os
import subprocess
import sys
from pathlib import Path
_project_root = Path(__file__).resolve().parent.parent
if str(_project_root) not in sys.path:
sys.path.insert(0, str(_project_root))
from config import get_config
def main() -> None:
cfg = get_config()
host = cfg.server.host or '0.0.0.0'
port = cfg.server.port or 8000
addr = f'{host}:{port}'
manage_py = _project_root / 'manage.py'
# Log files — capture ALL output so nothing goes to console
stdout_log = _project_root / 'server_stdout.txt'
stderr_log = _project_root / 'server_stderr.txt'
pid_file = _project_root / '.server_pid'
# Write PID so run.bat can print it
pid_file.write_text(str(os.getpid()), encoding='utf-8')
# Run server (blocks until server stops).
# Browser NOT opened here — webbrowser.open() hangs in hidden-window mode.
with open(stdout_log, 'a', encoding='utf-8') as out_fh, \
open(stderr_log, 'a', encoding='utf-8') as err_fh:
rc = subprocess.call(
[sys.executable, str(manage_py), 'runserver', addr, '--noreload'],
stdout=out_fh,
stderr=err_fh,
)
# Clean up PID file on exit
try:
pid_file.unlink(missing_ok=True)
except Exception:
pass
sys.exit(rc)
if __name__ == '__main__':
main()