Django:如何在服务器退出时运行一个函数?

时间:2015-04-25 15:24:14

标签: python django

我正在编写一个Django项目,其中使用Popen打开了几个进程。现在,当服务器退出时,这些进程是孤立的。我有一个函数来终止这些进程,我希望组织它,以便在服务器退出时自动调用此函数。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

由于您还没有指定您正在使用的HTTP服务器(uWSGI,nginx,apache等),您可以在简单的开发服务器上测试此配方。

您可以尝试通过atexit模块注册清理功能,该功能将在进程终止时调用。您可以通过覆盖django的内置runserver命令轻松完成此操作。

创建一个名为 runserver.py 的文件,并将其放在$PATH_TO_YOUR_APP/management/commands/目录中。

假设PROCESSES_TO_KILL是一个全局列表,其中包含对服务器终止时将被终止的孤立进程的引用。

import atexit
import signal
import sys

from django.core.management.commands.runserver import BaseRunserverCommand

class NewRunserverCommand(BaseRunserverCommand):
    def __init__(self, *args, **kwargs):
        atexit.register(self._exit)
        signal.signal(signal.SIGINT, self._handle_SIGINT)
        super(Command, self).__init__(*args, **kwargs)

    def _exit(self):
        for process in PROCESSES_TO_KILL:
            process.terminate()

    def _handle_SIGINT(signal, frame):
        self._exit()
        sys.exit(0)

请注意,这对于正常终止脚本非常有用,但在所有情况下都不会被调用(例如,致命的内部错误)。

希望这有帮助。

答案 1 :(得分:0)

首先,“当服务器退出时”是不明确的。响应请求时这些东西会运行吗?这个东西在管理命令期间运行吗?

让我们假设您在视图中运行它,因此您希望在每个视图返回后运行一些东西,以便清理视图留下的垃圾。

最有可能的是,你要做的是写一些Middleware。更具体地说,某种process_response

但是,根据您到目前为止的简短描述,您更有可能使用某个任务管理器,例如Celery来管理异步任务和进程。