在AppConfig的ready()方法中注册Django系统检查

Phi*_*ord 15 django

在Django的系统检查框架的文档中,它说:

检查应该在加载应用程序时加载的文件中注册; 例如,在该AppConfig.ready()方法中.

该页面上或该AppConfig.ready()方法周围的示例都没有显示如何执行此操作.给出一个检查方法,如:

from django.core.checks import register, Tags

@register(Tags.compatibility)
def my_check(app_configs, **kwargs):
    # ... perform compatibility checks and collect errors
    return errors
Run Code Online (Sandbox Code Playgroud)

你会如何在AppConfig.ready()方法中执行此操作?是从另一个叫来的吗?上面的方法应该进入哪个文件?你添加@register(...)ready()方法?

Phi*_*ord 12

通过阅读本页中有关Apps Registry和System Checks Framework 的示例,似乎(至少)有两种方法可以添加您自己的系统检查.要调整该页面的示例(假设您正在创建一个名为的应用程序myapp):


1)创建一个myapp/checks.py这样的文件:

from django.apps import apps as camelot_apps
from django.core.checks import register, Warning
from django.core.checks import Tags as DjangoTags

class Tags(DjangoTags):
    """Do this if none of the existing tags work for you:
    https://docs.djangoproject.com/en/1.8/ref/checks/#builtin-tags
    """
    my_new_tag = 'my_new_tag'

@register(Tags.my_new_tag)
def check_taggit_is_installed(app_configs=None, **kwargs):
    "Check that django-taggit is installed when usying myapp."
    errors = []
    try:
        from taggit import models
    except ImportError:
        errors.append(
            Warning(
                "The django-taggit app is required to use myapp.",
                hint=("Install django-taggit"),
                # A unique ID so it's easier to find this warning:
                id='myapp.W001',
            )
        )
    return errors
Run Code Online (Sandbox Code Playgroud)

然后在myapp/__init__.py(如果它不存在则创建它):

from . import checks
Run Code Online (Sandbox Code Playgroud)

运行此应运行上面的检查:

$ ./manage.py check myapp
Run Code Online (Sandbox Code Playgroud)

2)或者,正如我在初始问题中所想的那样,您可以在AppConfig中注册该检查.所以,保留上面的代码myapp/check.py,但删除该@register(Tags.my_new_tag)行.

然后创建myapp/apps.py包含这个:

from django.core.checks import register
from .checks import Tags, check_taggit_is_installed

class MyappConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        super(MyappConfig, self).ready()
        register(Tags.my_new_tag)(check_taggit_is_installed)
Run Code Online (Sandbox Code Playgroud)

并改变myapps/__init__.py它包含这个:

from . import checks
default_app_config = 'myapp.apps.MyappConfig'
Run Code Online (Sandbox Code Playgroud)

第一个示例似乎更简单,不需要自定义AppConfig.

  • [摘自Django 1.9 docs:](https://docs.djangoproject.com/en/1.9/ref/applications/#configuring-applications)“新应用应避免使用`default_app_config`。相反,它们应要求使用虚线指向相应的路径“ AppConfig”子类要在“ INSTALLED_APPS”中显式配置。您可以在“ INSTALLED_APPS”中指定新配置类的完整路径,而不是“ default_app_config”,例如:INSTALLED_APPS = [...'myapp.apps.MyappConfig'...] (2认同)

Wto*_*wer 11

Django建议:

检查应该在加载应用程序时加载的文件中注册; 例如,在该AppConfig.ready()方法中.

因此,将检查代码放在checks.py文件中.然后简单地说apps.py,就像信号一样:

from django.apps import AppConfig


class MyAppConfig(AppConfig):
    name = 'MyApp'
    verbose_name = "My App"

    def ready(self):
        # import myapp.signals
        import myapp.checks
Run Code Online (Sandbox Code Playgroud)