Инфраструктура управления системой

Платформа проверки системы - это набор статических проверок для проверки проектов Django. Он обнаруживает распространенные проблемы и дает советы по их устранению. Инфраструктура расширяема, так что вы можете легко добавлять свои собственные элементы управления.

Проверки могут запускаться явно командой check . Проверки запускаются неявно перед большинством команд, включая runserver и migrate . По соображениям производительности проверки не выполняются в контексте стека WSGI, используемого в развернутом режиме. Если вам нужно выполнить проверку системы на сервере развертывания, вызовите команду явно check .

Серьезные ошибки runserver вообще не позволят командам Django (например ) работать. О незначительных проблемах сообщается в консоли. Если вы выяснили причину предупреждения и готовы ее игнорировать, вы можете скрыть определенные предупреждения, используя параметр SILENCED_SYSTEM_CHECKS в файле настроек проекта.

Полный список всех элементов управления, которые может создавать Django, можно найти в Справочнике по системным элементам управления .

Написание собственных элементов управления

Система гибкая и позволяет вам писать функции, которые выполняют любой другой вид управления, который может вам понадобиться. Ниже приведен пример скелета функции управления:

from django.core.checks import Error, register

@register()
def example_check(app_configs, **kwargs):
    errors = []
    # ... your check logic here
    if check_failed:
        errors.append(
            Error(
                'an error',
                hint='A hint.',
                obj=checked_object,
                id='myapp.E001',
            )
        )
    return errors

Управляющая функция должна принимать один аргумент app_configs ; этот аргумент - список приложений, которые следует проверить. Если Нет, проверка должна выполняться для всех установленных приложений в проекте. Аргумент **kwargs нужен для будущих модификаций.

Сообщения

Функция должна вернуть список сообщений. Если после проверки проблем не обнаружено, функция проверки должна вернуть пустой список.

Предупреждения и ошибки, вызванные методом управления, должны быть экземплярами CheckMessage . Экземпляр CheckMessage инкапсулирует одну ошибку, о которой нужно сообщить, или одно предупреждение. Он также предоставляет руководство и контекст, применимые к сообщению, и уникальный идентификатор, который используется для целей фильтрации.

Концепция очень похожа на сообщения системы сообщений или ведение журнала . Сообщения помечаются значком, level указывающим на серьезность сообщения.

Также есть ярлыки, которые упрощают создание сообщений с базовыми уровнями. При использовании этих классов вы можете опустить параметр, level потому что он подразумевается именем класса.

Регистрация и маркировка элементов управления

Наконец, ваша функция управления должна быть явно зарегистрирована в реестре системных элементов управления. Элементы управления должны быть записаны в файл, который загружается при загрузке приложения. Например, в методе AppConfig.ready() .

register( * теги) (функция )

Вы можете передать столько меток, сколько хотите, register чтобы пометить свой элемент управления. Пометка элементов управления полезна, поскольку позволяет запускать только определенную группу элементов управления. Например, чтобы зарегистрировать проверку совместимости, вы должны сделать следующий вызов:

from django.core.checks import register, Tags

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

Вы можете ввести «проверки развертывания», которые применимы только к производственному файлу настроек, следующим образом:

@register(Tags.security, deploy=True)
def my_check(app_configs, **kwargs):
    ...

Эти проверки будут выполняться только при использовании этой опции .check --deploy

Вы также можете использовать register в качестве функции вместо декоратора, передав ему исполняемый объект (обычно функцию) в качестве первого параметра.

Приведенный ниже код эквивалентен приведенному выше коду:

def my_check(app_configs, **kwargs):
    ...
register(my_check, Tags.security, deploy=True)

Управление полями, моделями, менеджерами и базами данных

В некоторых случаях вам не потребуется регистрировать функцию мониторинга - вы можете перенести ее на существующую запись.

Поля, модели, менеджеры моделей и механизмы базы данных - все реализуют метод, check() который уже зарегистрирован в системе проверки. Если вы хотите добавить дополнительные проверки, вы можете расширить реализацию базового класса, выполнить любые дополнительные проверки, которые необходимы, и добавить любые сообщения к сообщениям, созданным базовым классом. Рекомендуется делегировать каждый элемент управления отдельным методам.

Рассмотрим пример, в котором вы реализуете именованное настраиваемое поле RangedIntegerField . Это поле добавляет аргументы min и max в конструктор » IntegerField . Вы можете добавить проверку, чтобы убедиться, что пользователи предоставляют минимальное значение, которое меньше или равно максимальному значению. В следующем коде показано, как можно реализовать этот элемент управления:

from django.core import checks
from django.db import models

class RangedIntegerField(models.IntegerField):
    def __init__(self, min=None, max=None, **kwargs):
        super().__init__(**kwargs)
        self.min = min
        self.max = max

    def check(self, **kwargs):
        # Call the superclass
        errors = super().check(**kwargs)

        # Do some custom checks and add messages to `errors`:
        errors.extend(self._check_min_max_values(**kwargs))

        # Return all errors and warnings
        return errors

    def _check_min_max_values(self, **kwargs):
        if (self.min is not None and
                self.max is not None and
                self.min > self.max):
            return [
                checks.Error(
                    'min greater than max.',
                    hint='Decrease min or increase max.',
                    obj=self,
                    id='myapp.E001',
                )
            ]
        # When no error, return an empty list
        return []

Если вы хотите добавить элементы управления в диспетчер моделей, вы примените тот же подход к своему подклассу Manager .

Если вы хотите добавить элемент управления в класс модели, подход почти такой же: единственное отличие состоит в том, что элемент управления является методом класса, а не методом экземпляра:

class MyModel(models.Model):
    @classmethod
    def check(cls, **kwargs):
        errors = super().check(**kwargs)
        # ... your own checks ...
        return errors

Написание тестов

Сообщения сопоставимы. Это позволяет легко писать тесты:

from django.core.checks import Error
errors = checked_object.check()
expected_errors = [
    Error(
        'an error',
        hint='A hint.',
        obj=checked_object,
        id='myapp.E001',
    )
]
self.assertEqual(errors, expected_errors)

Copyright ©2020 All rights reserved