Django 重写AppConfig.ready()

Django 重写AppConfig.ready(),django,Django,试图掌握Django的基本知识。即应用程序的工作方式。 文件: 在AppConfig类的代码中,我们可以看到: def ready(self): """ Override this method in subclasses to run code when Django starts. """ 这是我的例子: my_app/apps.py class MyAppConfig(AppConfig): name = 'my_app' def ready(s

试图掌握Django的基本知识。即应用程序的工作方式。 文件:

在AppConfig类的代码中,我们可以看到:

def ready(self):
    """
    Override this method in subclasses to run code when Django starts.
    """
这是我的例子:

my_app/apps.py

class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        print('My app')
def index(request):
    print('Print index')
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', my_app_views.index, name='home')
]
我只是想让准备好的方法发挥作用。也就是说,当Django找到我的_应用程序时,让它运行ready方法

该应用已在已安装的应用中注册

我执行“python manage.py runserver”。什么也没印出来

如果我在ready方法中放置一个断点,调试器就不会停在那里

你能帮我一下吗:我理解这里的错误是什么。先谢谢你

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'my_app',
]
我创建了一个视图

我的应用程序/视图.py

class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        print('My app')
def index(request):
    print('Print index')
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', my_app_views.index, name='home')
]
url.py

class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        print('My app')
def index(request):
    print('Print index')
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', my_app_views.index, name='home')
]

嗯,这个观点是有效的。这意味着应用程序已注册。

您需要执行以下两项操作之一。或者明确说明您希望在安装的应用程序中使用哪个
AppConfig

INSTALLED_APPS = [
    'my_app.apps.MyAppConfig'
]
或者,在应用程序的
\uuuu init\uuuuuuuuuuupy
中定义一个
默认应用程序配置:

# my_app/__init__.py
default_app_config = 'my_app.apps.MyAppConfig'
(并保持
已安装的应用程序
不变)

目前,Django找不到该应用程序的任何
AppConfig
,只是假设没有。因此,视图等可以工作,但永远不会调用
ready()
方法

这是我的建议


编辑:从Django 3.2开始,不再需要指定
默认应用程序配置
,-因此,对于任何使用Django 3.2或更高版本的人来说,这个答案是多余的。

请显示您在
已安装的应用程序
中注册应用程序的设置中的代码。请查看编辑的帖子。@Michael,它对您有用吗?因为我试着做同样的事情,我用的是公认的答案,但事实并非如此work@KyluAce是的,它运行正常。当我尝试将该行添加到
my\u app/\uuu init\uuuu.py
时,它不会调用
ready()
函数。使用
已安装的应用程序
路径,它可以正常工作。知道为什么不会调用它吗?它给了我django.core.exceptions.AppRegistryNotReady:应用程序还没有加载。错误请注意,当运行服务器两次跳过call ready()方法时,需要添加
--noreload
参数。@parikshitchake我也有同样的问题。这是由循环进口造成的。只要在
ready()
内移动导入的内容,而不是在其外移动,它就会工作。@watersnake:在我的例子中,我在默认应用配置中输入了拼写错误:…AppConfig,而不是正确的。。。。