重写AppConfig.ready()


76

尝试了解Django的基础知识。即应用程序如何工作。docs:https : //docs.djangoproject.com/zh-CN/stable/ref/applications/#methods

在类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')

我只是想让现成的方法起作用。也就是说,当Django找到my_app时,让它运行ready方法。

该应用已在INSTALLED_APPS中注册。

我执行'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',
]

我创建了一个视图

my_app / views.py

def index(request):
    print('Print index')

urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', my_app_views.index, name='home')
]

好吧,视图正在工作。这意味着该应用程序已注册。


请显示您在中注册应用的设置中的代码INSTALLED_APPS
凯文·克里斯托弗·亨利

请查看编辑后的帖子。
迈克尔

@Michael对您有用吗?因为我正在尝试做同样的事情,并且我使用的是可接受的答案,所以它不起作用
KyluAce

@KyluAce是的,它可以正常运行。
机会

Answers:


144

您需要执行以下两项操作之一。要么明确说出AppConfig您想要的INSTALLED_APPS

INSTALLED_APPS = [
    'my_app.apps.MyAppConfig'
]

或者,default_app_config__init__.py您的应用程序中定义:

# my_app/__init__.py
default_app_config = 'my_app.apps.MyAppConfig'

(并保持INSTALLED_APPS原样)。

由于目前是Django,找不到AppConfig适用于该应用程序的任何内容,只是假设没有该应用程序。因此,您的视图等将起作用,但该ready()方法将永远不会被调用。

这是文档相关部分


当我尝试将行添加到时my_app/__init__.py,它不会最终调用ready()函数。使用该INSTALLED_APPS路由可以正常工作。知道为什么不打电话吗?
watersnake

5
它给我django.core.exceptions.AppRegistryNotReady:应用尚未加载。错误
Parikshit Chalke,

请注意,--noreload当runserver两次跳过调用ready()方法时,需要添加参数。
dphans

1
@ParikshitChalke我有同样的问题。这是由于循环进口造成的。只要将要导入的内容移动到内部ready()而不是外部,它都将起作用。
lapin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.