System Check Framework در Django: راهنمای کامل نوشتن، ثبت، اجرا و تست چک‌های سیستمی

System Check Framework در Django مجموعه‌ای از بررسی‌های استاتیک برای تشخیص مشکلات رایج در پروژه است. این مقاله نحوهٔ اجرای چک‌ها، نوشتن چک‌های سفارشی، مدیریت پیام‌ها، برچسب‌گذاری چک‌ها، افزودن چک به مدل‌ها و فیلدها، و نوشتن تست‌های واحد و یکپارچه برای چک‌ها را توضیح می‌دهد.

Django system check، چک سفارشی جنگوregister check، CheckMessage، ErrorWarning، Tags، تست چک‌ها، check command

~4 دقیقه مطالعه • بروزرسانی ۲۴ اسفند ۱۴۰۴

System Check Framework چیست؟

System Check Framework مجموعه‌ای از بررسی‌های داخلی Django است که مشکلات رایج پیکربندی و کدنویسی را شناسایی می‌کند. این چک‌ها قبل از اجرای بسیاری از دستورات مانند runserver و migrate اجرا می‌شوند.

برای اجرای دستی چک‌ها:


python manage.py check

در محیط production، چک‌ها به‌صورت خودکار اجرا نمی‌شوند و باید آن‌ها را دستی اجرا کنید.

خطاهای جدی مانع اجرای Django می‌شوند، اما هشدارها فقط در کنسول نمایش داده می‌شوند. برای نادیده گرفتن هشدارهای خاص، از SILENCED_SYSTEM_CHECKS استفاده کنید.


نوشتن چک‌های سفارشی

چک‌ها توابعی هستند که مشکلات را بررسی کرده و لیستی از پیام‌ها برمی‌گردانند.

نمونهٔ یک چک ساده


from django.core.checks import Error, register

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

پارامترهای مهم

  • app_configs: لیست اپلیکیشن‌هایی که باید بررسی شوند
  • databases: لیست دیتابیس‌هایی که اجازهٔ استفاده از آن‌ها را دارید
  • **kwargs: برای توسعهٔ آینده

پیام‌ها در چک‌ها

هر پیام باید نمونه‌ای از CheckMessage باشد. سطوح پیام‌ها شامل:

  • Debug
  • Info
  • Warning
  • Error
  • Critical

برای راحتی، کلاس‌های میان‌بری مانند Error و Warning وجود دارند.


ثبت و برچسب‌گذاری چک‌ها

چک‌ها باید با @register() ثبت شوند.

برچسب‌گذاری چک‌ها


from django.core.checks import register, Tags

@register(Tags.compatibility)
def my_check(app_configs, **kwargs):
    return []

برای چک‌های مخصوص production:


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

این چک‌ها فقط با دستور زیر اجرا می‌شوند:


python manage.py check --deploy

چک‌های فیلد، مدل، مدیر، دیتابیس و ...

بسیاری از کلاس‌های Django مانند Field، Model، Manager و Database Backend یک متد check() دارند که از قبل ثبت شده است. برای افزودن چک سفارشی، کافی است این متد را override کنید.

مثال: افزودن چک به یک فیلد سفارشی


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):
        errors = super().check(**kwargs)
        errors.extend(self._check_min_max_values())
        return errors

    def _check_min_max_values(self):
        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",
                )
            ]
        return []

نوشتن تست برای چک‌ها

پیام‌ها قابل مقایسه هستند، بنابراین تست‌نویسی ساده است:


from django.core.checks import Error

errors = checked_object.check()
expected = [
    Error("an error", hint="A hint.", obj=checked_object, id="myapp.E001")
]
self.assertEqual(errors, expected)

تست یکپارچهٔ چک‌ها

برای تست چک‌هایی که هنگام اجرای check ثبت می‌شوند:


from django.core.management import call_command
from django.core.management.base import SystemCheckError

with self.assertRaisesMessage(SystemCheckError, "(sites.E101) ..."):
    call_command("check")

مثال: تست هشدار در حالت deploy


from io import StringIO

stderr = StringIO()
call_command("check", "-t", "myapp", "--deploy", stderr=stderr)
self.assertIn("(myapp.W001)", stderr.getvalue())

جمع‌بندی

System Check Framework یکی از ابزارهای قدرتمند Django برای تضمین سلامت پروژه است. با نوشتن چک‌های سفارشی، برچسب‌گذاری، استفاده از چک‌های مدل و فیلد، و نوشتن تست‌های دقیق، می‌توانید پروژه‌ای پایدار، امن و بدون خطا داشته باشید. این سیستم به‌ویژه در پروژه‌های بزرگ و تیمی ارزش بسیار بالایی دارد.

نوشته و پژوهش شده توسط دکتر شاهین صیامی