为何Windows Service无法运行我的Django服务器?
问题分析与解决方案
核心问题
你的Windows服务能启动但Django服务器未运行,主要是以下几个代码逻辑和配置错误:
1. __name__ == '__main__' 条件永远不触发
在TestServiceForMeasurewarning.run()的while循环里定义了main()函数,并且用if __name__ == '__main__':判断是否执行。但Windows服务启动时,当前模块的__name__并不是__main__,导致main()完全没被调用,自然不会启动Django服务器。
2. 工作目录错误
Windows服务默认工作目录是C:\Windows\System32,而非你的Django项目根目录,导致Django找不到settings.py及项目相关文件。
3. 循环结构冗余且阻塞
runserver本身是阻塞式启动,用while循环包裹它毫无意义,还会导致服务无法正确响应停止信号。
修复后的代码示例
import os import sys import win32serviceutil import win32service import servicemanager class DjangoService: def __init__(self): # 替换为你的Django项目根目录 self.project_dir = r"C:\path\to\your\django_tutorial" self.running = False def stop(self): self.running = False # 可添加Django服务器的停止逻辑,比如发送终止信号 def run(self): self.running = True # 切换到Django项目目录 os.chdir(self.project_dir) # 设置Django环境变量 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_tutorial.settings') # 将项目路径加入Python搜索路径 sys.path.append(self.project_dir) try: from django.core.management import execute_from_command_line # 启动Django服务器 args = ['manage.py', 'runserver', '0.0.0.0:8003'] execute_from_command_line(args) except ImportError as exc: # 将错误写入系统日志 servicemanager.LogErrorMsg(str(exc)) raise class MyServiceFramework(win32serviceutil.ServiceFramework): _svc_name_ = 'DjangoMeasurementService' _svc_display_name_ = 'Django Measurementwarning Service' def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) self.service_impl.stop() self.ReportServiceStatus(win32service.SERVICE_STOPPED) def SvcDoRun(self): self.ReportServiceStatus(win32service.SERVICE_START_PENDING) self.service_impl = DjangoService() self.ReportServiceStatus(win32service.SERVICE_RUNNING) self.service_impl.run() def init(): if len(sys.argv) == 1: servicemanager.Initialize() servicemanager.PrepareToHostSingle(MyServiceFramework) servicemanager.StartServiceCtrlDispatcher() else: win32serviceutil.HandleCommandLine(MyServiceFramework) if __name__ == '__main__': init()
额外配置注意事项
- 替换项目路径:务必将
self.project_dir的值修改为你实际的Django项目根目录。 - 权限配置:确保Windows服务的运行账号拥有访问项目目录、启动服务器的权限(建议使用本地系统账号或具备足够权限的域账号)。
- 日志排查:若仍无法运行,可通过Windows事件查看器(事件查看器→Windows日志→应用程序)查看服务错误日志,定位具体问题。
- 虚拟环境处理:若使用了虚拟环境,需在
run()方法中先激活虚拟环境,示例代码:# 替换为你的虚拟环境路径 venv_dir = r"C:\path\to\your\venv" activate_script = os.path.join(venv_dir, 'Scripts', 'activate_this.py') with open(activate_script) as f: exec(f.read(), {'__file__': activate_script})
内容的提问来源于stack exchange,提问作者FlyAcrossVT
相关产品推荐
相关产品推荐

