编辑:
我仍然不确定您要达到的目标,并且评论者强调了一些重要的问题。首先,这个AppRegistryNotReady: Apps aren't loaded yet
错误真的很令人沮丧,我很感激。我不确定您是如何组织项目的,因此无法提供确切的解决方案。这可能是您组织文件的方式以及您从哪里导入应用程序的 AppConfig 类。您是否将它或任何自定义函数或类放在您的应用程序包级别__init__.py
,以便从那里导入?如果是这样,这似乎使 Django 感到困惑,请参阅https://stackoverflow.com/a/34136825/2275482
第二:
我试图在命令后立即调用函数python manage.py runserver
我认为我们正在努力了解您要实现的目标以及您是否将 Django 应用程序启动时与服务器启动时混为一谈。正如评论者所指出的,Web 服务器完全独立于 Django;这是一个单独的过程。
甚至与 Django 捆绑的测试服务器也独立于您的 Django 应用程序。它只是为了方便而放在那里的一个简单的开发服务器,但它不是必需的,也不应该在生产中使用。Django 是按照PEP 333构建的。AFAIK,它适用于任何符合 PEP 333 的 WSGI Web 服务器,无论是 Apache 和 mod_wsgi、gunicorn 还是 uWSGI 等。如果您希望代码与您正在使用的服务器相关,您需要查看服务器文档。
manage.py
likedjango-admin
只是一个帮助开发的实用程序,请参阅https://docs.djangoproject.com/en/2.1/ref/django-admin/。当您调用时,manage.py runserver
您正在调用一个实用程序,该实用程序会加载您的应用程序并设置测试服务器。您可以在文件本身中看到执行流程、正在导入的实用程序等。此执行流程与使用生产服务器时发生的情况不同。
据我所知,生产服务器从根wsgi.py
文件加载您的 django 应用程序。它甚至不会看manage.py
因此,这可以追溯到您是否尝试在服务器启动后发布消息,在这种情况下,这与 Django 无关,或者当您的 Django 应用程序启动时?
如果您在 django 应用程序启动、启动并加载到服务器后尝试打印内容,那么您有很多选择。如果你真的想要,你可以编辑和添加,manage.py
但除此之外我不会篡改 Django 的核心。当使用不同的生产服务器时,这将被完全忽略。
如果您想编辑无论正在使用的服务器如何都将加载的入口点,那么您可以编辑项目的wsgi.py
模块或单个应用程序的 AppConfigready()
方法。
如果您想构建独立于 Django 并在后台持续运行的东西,那么正如@bruno-desthuilliers 指出的那样,您需要构建一个单独的进程作为 cron 作业或使用 celery 甚至 django-carrot 如果您愿意,尽管后者仍与应用程序启动相关联,但可以作为单独的工作人员工作(我认为)。Django-carrot 只有非常简单的小工作功能。
如果这没有任何帮助,我很抱歉,我可以用提供的信息做最好的事情。
ready()
当我想在我的应用程序 AppConfig的方法中运行某些东西时,我遇到了类似的问题。对我来说,这是我的应用程序安装在我的INSTALLED_APPS
设置变量中的方式。
通常你会像这样注册你的应用程序:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'my_app',
]
但是,这将加载用于注册您的应用程序的基本 AppConfig 类。如果你自定义并覆盖了应用的AppConfig,这样你就可以声明你自己的ready()
方法,一旦应用被实例化就会执行,你需要直接在INSTALLED_APPS
所以
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'my_app.apps.MyAPPConfig', # MyAppConfig is the config class that inherits from AppConfig
]
或者,如果您不希望在通过其 AppConfig 加载特定应用程序时执行此操作,因此不是通过ready()
方法,而是当项目加载到服务器时,您可以wsgi.py
在应用程序加载后将 a 放置在项目模块中
IE
application = get_wsgi_application()
print('Hello World')
希望有帮助