Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:仅为“manage.py runserver”执行代码,而不是为“migrate”、“help”等执行代码_Python_Django_Server_Neural Network - Fatal编程技术网

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

Python Django:仅为“manage.py runserver”执行代码,而不是为“migrate”、“help”等执行代码,python,django,server,neural-network,Python,Django,Server,Neural Network,我们正在使用Django作为一个网站的后端,该网站提供各种内容,其中包括使用Tensorflow的神经网络来回答某些请求 为此,我们创建了一个AppConfig,并将此应用配置加载到Django的settings.py中安装的应用程序中。然后,此AppConfig在神经网络初始化后立即加载: settings.py: INSTALLED_APPS = [ ... 'bert_app.apps.BertAppConfig', ] …/bert_apps/app.py: class Ber

我们正在使用Django作为一个网站的后端,该网站提供各种内容,其中包括使用Tensorflow的神经网络来回答某些请求

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

settings.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.
现在,虽然它可以正常工作并完成它应该做的事情,但是ANN现在可以为通过
manage.py
运行的每个命令加载。虽然我们当然希望在调用
manage.py runserver
时执行它,但我们不希望在调用
manage.py migrate
manage.py help
和所有其他命令时运行它


一般来说,我不确定这是否是为Django后端加载ANN的正确方法,所以有没有人知道如何正确地完成这项工作?我可以想象,在启动时加载模型并不是最好的做法,相反,我非常愿意接受关于如何正确地执行该操作的建议


但是,除了实际的模型加载之外,还有一些其他代码也需要几秒钟的时间,而且肯定应该在服务器启动时立即执行(如
manage.py runserver
),但也不是在
manage.py help
(因为这也需要几秒钟),那么,对于如何告诉Django只在
运行服务器上执行它,而不在它的其他命令上执行它,是否有一些快速修复方法呢?

这是另一种方法,在您的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
,如果有,那么执行您的脚本或函数

我有一个类似的问题,通过检查
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\u py
部分:在生产环境中,您使用uwsgi/uvicorn/…运行web服务器,它仍然是一个web服务器,只是没有使用
manage.py
运行。最有可能的是,它是您在没有
manage.py


使用
AppConfig.ready()
-它专门用于:

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

要恢复您的
AppConfig
,请使用:

from django.apps import apps
apps.get_app_config(app_name)
# apps.get_app_configs()  # all


您的代码片段看起来像是混合了Django和Flask代码。“我通常不确定这是否是正确的加载方式”->通常初始化任何额外内容的正确方式是从AppConfig。但是请注意,这将在分叉之前完成。根据您使用的Web服务器,您可以有多个进程,并且它们可能在中间被杀死。所以,如果您的神经网络应该跨请求在RAM中保存一些数据,那么您可能需要一种完全不同的方法。你为什么这么认为?你觉得什么样的烧瓶代码?@Art那么你的意思是,一般来说,只要我们不使用多个进程,我们在这里所做的是正确的?如果我们愿意,你有什么建议?我最初的建议是将模型作为微服务提供,但团队告诉我,这太过工程化了…@ChrisStenkamp,你也可以在不进行多重处理的情况下直接攻击自己:)如果你不需要在请求之间保持更改的状态,那么你所做的是正确的。首先,回答以下问题:请求是否会更新内存中的ANN状态,以便在发出下一个web请求时看到此更新状态?如果没有,继续你正在做的事情。如果是,那么事情就变得更复杂了:您需要单独运行ANN(例如,在一个单独的manage.py命令中),并使用某种形式的IPC/RPC与之通信。谢谢,这似乎可行!)但是有一件事:到目前为止,我们甚至没有创建AppConfig的实例(正如您在问题中看到的,
predictor
只是类的一个属性)。所以当我们使用它时,我们在其他地方使用bert_app.apps import BertAppConfig
BertAppConfig.predictor.do_stuff()
。在您的回答中,AppConfig似乎是OOP。我们以后如何访问它的实例?也许是单身模式?Django何时调用
ready()
?@ChrisStenkamp Django将为您创建一个实例。使用
ready()
方法,它是专门为它设计的。要检索您在
AppConfig
中创建的对象,只需获取您的
AppConfig
,甚至可以将其存储到某个模块范围(全局)变量中(最好不要在
apps.py
中,而是其他地方)。请不要在Python中实现您自己的单例——有一些模块可以实现它。我用infor about
AppConfig
更新了答案。但是这样做,除了runserver之外,其他命令上不会加载任何内容,例如
help
命令只会退出而不返回任何内容。。