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

问题描述 投票:0回答:3

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

为此,我们创建了一个

AppConfig
并将此应用程序配置的加载添加到 Django 的
INSTALLED_APPS
中的
settings.py
。此 AppConfig 在初始化后立即加载神经网络:

设置.py:

INSTALLED_APPS = [
...
    'bert_app.apps.BertAppConfig',
]

.../bert_apps/app.py:

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

现在,虽然它可以正常工作并执行其应有的功能,但现在会为通过

manage.py
运行的每个命令加载 ANN。虽然我们当然希望它在您调用
manage.py runserver
时执行,但我们不希望它为
manage.py migrate
manage.py help
以及所有其他命令运行。

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

但是,除了实际的模型加载之外,还有一些其他代码也需要几秒钟的时间,并且肯定应该在服务器启动后立即执行(所以

manage.py runserver
),但也不是
manage.py help 
(因为它也需要几秒钟),那么是否有一些快速修复来告诉Django仅在
runserver
上执行它而不是其他命令?

python django server neural-network
3个回答
6
投票

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

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()

现在更接近

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


0
投票

这是另一种方式,在你的manage.py中可能会有这样的东西

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'slambook.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)
    # check if has runserver
    if `runserver` in sys.argv:
        #execute your custom function


if __name__ == '__main__':
    main()

您可以检查

sys.argv
是否有
runserver
,如果有则执行您的脚本或函数


0
投票

我们可以通过以下方式检查,执行了哪个命令,是runserver还是migrate...等等

import sys
print("runserver" in sys.argv)
© www.soinside.com 2019 - 2024. All rights reserved.