我们使用 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
上执行它而不是其他命令?
我也有类似的问题,通过检查解决了它
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
这是另一种方式,在你的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
,如果有则执行您的脚本或函数
我们可以通过以下方式检查,执行了哪个命令,是runserver还是migrate...等等
import sys
print("runserver" in sys.argv)