在runserver期间编译Django中的proto文件

时间:2016-07-23 01:13:14

标签: django protocol-buffers

我正在使用Django,我在机器上安装了protoc。我想在启动服务器时自动编译所有app目录中的所有proto文件:

./manage.py runserver ...

这可能吗?

1 个答案:

答案 0 :(得分:0)

我对protoc并不熟悉,但您可以使用runserver执行任何操作。您需要创建自定义runserver django admin command来覆盖默认值。这是一个示例:

import os
import subprocess
import atexit
import signal

from django.conf import settings
from django.contrib.staticfiles.management.commands.runserver import Command\
    as StaticfilesRunserverCommand


class Command(StaticfilesRunserverCommand):

    def inner_run(self, *args, **options):
        self.start_something()
        return super(Command, self).inner_run(*args, **options)

    def start_something(self):
        self.stdout.write('>>> Starting something')
        self.some_process = subprocess.Popen(
            '.....',
            shell=True,
            stdin=subprocess.PIPE,
            stdout=self.stdout,
            stderr=self.stderr,
        )

        self.stdout.write('>>> Some process on pid {0}'.format(self.some_process.pid))

        def kill_some_process(pid):
            self.stdout.write('>>> Closing some process')
            os.kill(pid, signal.SIGTERM)

        atexit.register(kill_some_process, self.some_process.pid)

请注意,您需要从django.contrib.staticfiles.management.commands.runserver而不是django.core.management.base派生此内容,否则您将丢失collectstatic内容。

此外,无论如何,如果它自己退出,你显然不需要杀死它。