【问题标题】:Overriding AppConfig.ready()覆盖 AppConfig.ready()
【发布时间】:2016-09-22 14:53:30
【问题描述】:

试图掌握 Django 的基础知识。即应用程序如何工作。 文档:https://docs.djangoproject.com/en/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')

我只想让 ready 方法工作。也就是说,当 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 是的,它运行正常。

标签: django


【解决方案1】:

你需要做两件事之一。在INSTALLED_APPS 中明确说出您想要哪个AppConfig

INSTALLED_APPS = [
    'my_app.apps.MyAppConfig'
]

或者,在您的应用的__init__.py 中定义一个default_app_config

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

(并保持 INSTALLED_APPS 原样)。

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

这是relevant section of the documentation

编辑:从 Django 3.2 开始,不再需要指定 default_app_configand is in fact deprecated - 所以这个答案对于任何使用 Django 3.2 或更高版本的人来说都是多余的。

【讨论】:

  • 当我尝试将该行添加到my_app/__init__.py 时,它最终不会调用ready() 函数。使用INSTALLED_APPS 路由可以正常工作。知道为什么不调用它吗?
  • 它给了我 django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。错误
  • 注意,runserver时需要添加--noreload参数,跳过两次调用ready()方法。
  • @ParikshitChalke 我遇到了同样的问题。这是循环进口造成的。只需将您要导入的任何内容移动到 ready() 内而不是其外,它就会起作用。
  • @watersnake:就我而言,我在 default_app_config 中有错字:...AppConfig 而不是正确的 ...
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 2012-01-28
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2020-06-06
  • 2011-01-23
相关资源
最近更新 更多