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

Django管理命令能否判断服务器是否正在运行?

判断Django服务器运行状态的可行方案

当然可以在你的自定义管理命令里判断服务器是否处于运行状态,下面是几种实用的实现方式:

1. 检测监听端口占用

直接检查Django服务器默认(或自定义)的端口是否被占用,这是最直观的方式:

import socket
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self, *args, **options):
        # 替换成你的服务器实际端口
        target_port = 8000
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            # 尝试连接端口,返回0表示端口被占用
            if s.connect_ex(('127.0.0.1', target_port)) == 0:
                self.stdout.write(self.style.ERROR('服务器正在运行,终止数据库操作'))
                return
            # 这里编写你的数据库操作逻辑
            self.stdout.write(self.style.SUCCESS('数据库操作执行完成'))

注意:如果服务器绑定的是0.0.0.0这类全局地址,需要把127.0.0.1换成对应IP;如果用了非默认端口,务必修改target_port的值。

2. 查找Django服务器进程

通过进程信息精准识别runserver进程,避免端口被其他程序占用导致的误判:

import psutil
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self, *args, **options):
        server_running = False
        for proc in psutil.process_iter(['cmdline']):
            try:
                cmd_args = proc.info['cmdline']
                if cmd_args and 'manage.py' in cmd_args and 'runserver' in cmd_args:
                    server_running = True
                    break
            except (psutil.NoSuchProcess, psutil.AccessDenied):
                continue
        
        if server_running:
            self.stdout.write(self.style.ERROR('服务器正在运行,终止操作'))
            return
        # 执行数据库操作
        self.stdout.write(self.style.SUCCESS('数据库操作完成'))

这种方法需要提前安装psutil库(pip install psutil),优势是能精准定位Django服务器进程,不会被其他占用同端口的程序干扰。

3. 使用自定义锁文件标记状态

在服务器启动时创建一个临时锁文件,关闭时自动删除,管理命令通过检查锁文件是否存在判断状态:

import os
from django.core.management.base import BaseCommand
from django.conf import settings

class Command(BaseCommand):
    def handle(self, *args, **options):
        lock_file_path = os.path.join(settings.BASE_DIR, '.server_running.lock')
        if os.path.exists(lock_file_path):
            self.stdout.write(self.style.ERROR('服务器正在运行,终止操作'))
            return
        # 执行数据库操作
        self.stdout.write(self.style.SUCCESS('数据库操作完成'))

同时需要自定义一个服务器启动命令,负责创建和清理锁文件:

import atexit
import os
from django.conf import settings
from django.core.management.commands.runserver import Command as RunserverCommand

class Command(RunserverCommand):
    def handle(self, *args, **options):
        lock_file_path = os.path.join(settings.BASE_DIR, '.server_running.lock')
        with open(lock_file_path, 'w') as f:
            f.write(str(os.getpid()))
        # 服务器退出时删除锁文件
        atexit.register(lambda: os.remove(lock_file_path) if os.path.exists(lock_file_path) else None)
        super().handle(*args, **options)

这种方法可靠性最高,但需要替换默认的runserver命令来维护锁文件状态。


内容的提问来源于stack exchange,提问作者Peter Kronenberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:29:54