You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:20:32