Edit:
我仍然不确定你想达到什么目的,有一些评论者强调了一些重要的关切。首先,
AppRegistryNotReady: Apps aren't loaded yet
的错误确实令人沮丧,我很理解。我不确定你是如何组织你的项目的,所以不能提供一个确切的解决方案。这可能是你组织文件的方式以及你从哪里导入你的应用程序的AppConfig类。你是否把它或任何自定义函数或类放在你的应用程序包层
__init__.py
,以便你从那里导入?如果是这样的话,这似乎会让Django感到困惑,参见
https://stackoverflow.com/a/34136825/2275482
Secondly:
我试图在命令之后调用函数
python manage.py runserver
。
我认为我们正在努力理解你想要实现的目标,以及你是否将Django应用程序的启动时间与服务器的启动时间混为一谈。正如评论者所指出的,网络服务器是完全独立于Django的,它是一个独立的进程。
即使是与Django捆绑的测试服务器也是独立于你的Django应用程序的。它只是一个简单的开发服务器,为了方便而放在那里,但它不是必需的,也不应该在生产中使用。Django的构建符合
PEP 333
.AFAIK,它可以在任何符合PEP 333的WSGI网络服务器上工作,无论是Apache和mod_wsgi、gunicorn还是uWSGI等等。如果你想在你使用的服务器上执行代码,你需要查看该服务器的文档。
替换代码3】像
django-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
模块或单个应用程序的AppConfig
ready()
方法。
如果你想建立独立于Django的东西,并在后台持续运行,那么正如@bruno-desthuilliers所指出的,你需要建立一个独立的进程,要么作为一个cron job,要么使用celery,甚至是django-carrot(如果你想的话),尽管后者仍然与应用程序的启动有关,但可以作为一个独立的工作者工作(我想)。Django-carrot只有非常简单的功能,用于小型工作。
如果这没有任何帮助,我很抱歉,对于所提供的信息我只能做到最好。
当我想在我的应用程序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',
然而这将加载用于注册你的应用程序的基础AppConfig类。如果你定制并覆盖了应用程序的AppConfig,这样你就可以声明你自己的ready()
方法,一旦应用程序被实例化就会执行,你需要在INSTALLED_APPS
中直接引用被覆盖的AppConfig。
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
模块
application = get_wsgi_application()
print('Hello World')
希望这对您有所帮助