【问题标题】:How is Django apps.py supposed to be used?应该如何使用 Django apps.py?
【发布时间】:2017-01-27 04:40:11
【问题描述】:

我正在使用 django 1.10.5

似乎 app1 中的 apps.py 文件没有被导入,除非我在该模块的 __init__ 中明确设置 default_app_config = 'app1.apps.App1Config'

然而,in the docs 我正在阅读“新应用程序应避免使用 default_app_config。相反,它们应要求在 INSTALLED_APPS 中显式配置相应 AppConfig 子类的虚线路径。”

我将其视为在 INSTALLED_APPS 中包含该模块,例如

INSTALLED_APPS = (
 '...',
 'app1',
)

我确实有。

也许我对“适当的 AppConfig 子类的虚线路径”这一语言感到困惑,也许除了列出主模块之外还有更多内容?

我的具体用途是我想导入 handlers.py 以便将其包含在应用程序中,因为它有一些需要监听的信号接收器。

为此,我遵循了in the docs 的建议,它说“实际上,信号处理程序通常在与其相关的应用程序的信号子模块中定义。信号接收器在您的应用程序配置的 ready() 方法中连接类。如果您使用的是 receiver() 装饰器,只需在 ready() 中导入信号子模块。"

# apps.py
from django.apps import AppConfig
class App1Config(AppConfig):
    name = 'app1'
    def ready(self):
        import app1.handlers

# handlers.py
from django.dispatch import receiver
from django.db.models.signals import post_save
from app1.models import App1

@receiver(post_save, sender=App1)
def say_you_did_something(sender, instance, **kwargs):
    print("Action has been taken.")

但这绝对没有任何作用......

直到我也添加了

# __init__.py
default_app_config = 'individual.apps.IndividualConfig'

除了

所以要从实际意义上重述这个问题,让项目了解 handlers.py 文件的推荐方法是什么?

【问题讨论】:

    标签: django


    【解决方案1】:

    您误解了说明。正如它所说,您需要在 INSTALLED_APPS 中包含 AppConfig 类本身 的虚线路径,而不是应用程序。

    INSTALLED_APPS = (
     '...',
     'app1.apps.App1Config',
    )
    

    【讨论】:

    • 附加信息:通过简单地添加附加行来更改 INSTALLED_APPS 时,我发现它应该替换引用应用程序的行。 IE。 “app1.apps.App1Config”替换“app1”。两者都会导致错误“django.core.exceptions.ImproperlyConfigured:应用程序标签不是唯一的,重复:app1”
    【解决方案2】:

    替换

    INSTALLED_APPS = (
     '...',
     'app1,
    )
    

    INSTALLED_APPS = (
     '...',
     'app1.apps.App1Config',
    )
    

    无需在init.py

    中添加default_app_config

    在 django 3.0 应用程序文档中提到了如何包含虚线路径。 以下是 django 应用文档https://docs.djangoproject.com/en/3.0/ref/applications/#django.apps.AppConfig.ready 的摘录:

    对于应用程序作者¶ 如果您正在创建一个名为“Rock 'n' roll”的可插拔应用程序,您可以通过以下方式为管理员提供适当的名称:

    # rock_n_roll/apps.py
    
    from django.apps import AppConfig
    
    class RockNRollConfig(AppConfig):
        name = 'rock_n_roll'
        verbose_name = "Rock ’n’ roll"
    

    您可以让您的应用程序默认加载此 AppConfig 子类,如下所示:

    # rock_n_roll/__init__.py
    
    default_app_config = 'rock_n_roll.apps.RockNRollConfig'
    

    这将导致在 INSTALLED_APPS 包含“rock_n_roll”时使用 RockNRollConfig。这允许您使用 AppConfig 功能,而无需您的用户更新他们的 INSTALLED_APPS 设置。除了这个用例,最好避免使用 default_app_config,而是在 INSTALLED_APPS 中指定应用配置类,如下所述。

    当然,您也可以告诉您的用户将“rock_n_roll.apps.RockNRollConfig”放入他们的 INSTALLED_APPS 设置中。您甚至可以提供几个具有不同行为的不同 AppConfig 子类,并允许您的用户通过他们的 INSTALLED_APPS 设置来选择一个。

    【讨论】:

    • 我很久以前就处理过这个特定的问题,我不记得发布过它。但感谢您提供 3.0 的更详细信息和更新。
    猜你喜欢
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2016-10-27
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多