Django:仅执行“manage.py runserver”代码,而不是“migrate”、“help”等

Chr*_*amp 6 python django neural-network server

我们使用 Django 作为提供各种功能的网站的后端,其中包括使用 Tensorflow 的神经网络来回答某些请求。

为此,我们创建了一个AppConfig应用程序配置并将其加载添加到INSTALLED_APPSDjango 的settings.py. 此 AppConfig 在初始化后立即加载神经网络:

设置.py:

INSTALLED_APPS = [
...
    'bert_app.apps.BertAppConfig',
]
Run Code Online (Sandbox Code Playgroud)

.../bert_apps/app.py:

class BertAppConfig(AppConfig):
    name = 'bert_app'
    if 'bert_app.apps.BertAppConfig' in settings.INSTALLED_APPS:
        predictor = BertPredictor() #loads the ANN.
Run Code Online (Sandbox Code Playgroud)

现在,虽然它可以正常工作并执行其应有的功能,但现在会为运行的每个命令加载 ANN manage.py。虽然我们当然希望它在您调用时执行manage.py runserver,但我们不希望它运行manage.py migrate,或者manage.py help以及所有其他命令运行。

我通常不确定这是否是为 Django 后端加载 ANN 的正确方法,所以有人有任何提示如何正确执行此操作吗?我可以想象,在启动时加载模型并不是最佳实践,并且我非常愿意接受有关如何正确执行此操作的建议。

然而,除了实际的模型加载之外,还有一些其他代码也需要几秒钟的时间,并且肯定应该在服务器启动后立即执行(依此类推manage.py runserver),但也不是manage.py help(因为它需要几秒钟)秒),那么是否有一些快速修复方法可以告诉 Django 仅执行它runserver而不是其他命令?

Art*_*Art 7

我也有类似的问题,通过检查解决了argv

class SomeAppConfig(AppConfig):

    def ready(self, *args, **kwargs):
        is_manage_py = any(arg.casefold().endswith("manage.py") for arg in sys.argv)
        is_runserver = any(arg.casefold() == "runserver" for arg in sys.argv)

        if (is_manage_py and is_runserver) or (not is_manage_py):
            init_your_thing_here()
Run Code Online (Sandbox Code Playgroud)

现在更接近这if not is_manage_py部分:在生产中,您使用 uwsgi/uvicorn/... 运行 Web 服务器,它仍然是一个 Web 服务器,只是它不使用manage.py. 最有可能的是,这是你跑步时唯一不带的东西manage.py


使用AppConfig.ready()- 它的目的是:

子类可以重写此方法来执行初始化任务,例如注册信号。一旦注册表被完全填充,它就会被调用。- [django 文档]

要恢复AppConfig正常,请使用:

from django.apps import apps
apps.get_app_config(app_name)
# apps.get_app_configs()  # all
Run Code Online (Sandbox Code Playgroud)