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

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

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

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۲۴ اسفند ۱۴۰۴

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 برای تضمین سلامت پروژه است. با نوشتن چک‌های سفارشی، برچسب‌گذاری، استفاده از چک‌های مدل و فیلد، و نوشتن تست‌های دقیق، می‌توانید پروژه‌ای پایدار، امن و بدون خطا داشته باشید. این سیستم به‌ویژه در پروژه‌های بزرگ و تیمی ارزش بسیار بالایی دارد.

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

مقالات مرتبط

فریم‌ورک Tasks در Django: راهنمای کامل اجرای کارهای پس‌زمینه در Django 6.0

Django 6.0 فریم‌ورک Tasks را معرفی کرده است؛ سیستمی داخلی برای تعریف و صف‌بندی کارهای پس‌زمینه خارج از چرخهٔ request–response. این مقاله نحوهٔ کار Tasks، پیکربندی backendها، تعریف و enqueue کردن Taskها، استفاده از context، و ادغام با سیستم‌های Worker خارجی را توضیح می‌دهد.

ادامه

پشتیبانی Asynchronous در Django: راهنمای کامل Async Views، ORM، Middleware، عملکرد و ایمنی

این مقاله پشتیبانی Django از برنامه‌نویسی غیرهم‌زمان (async) را توضیح می‌دهد. موضوعاتی مانند async views، اجرای Django تحت ASGI، رفتار middleware، قابلیت‌های ORM غیرهم‌زمان، sync_to_async، مدیریت قطع اتصال، نکات عملکردی، و مکانیزم‌های ایمنی Django برای جلوگیری از استفادهٔ ناامن async بررسی می‌شوند.

ادامه

سیگنال‌ها در Django: راهنمای کامل استفاده، اتصال، ارسال و مدیریت Signalها

این مقاله سیستم سیگنال‌های Django را توضیح می‌دهد؛ مکانیزمی برای اطلاع‌رسانی رویدادها بین بخش‌های مختلف برنامه بدون ایجاد وابستگی مستقیم. موضوعاتی مانند نحوهٔ اتصال receiverها، استفاده از decorator، مدیریت senderهای خاص، محل مناسب قرارگیری کد سیگنال‌ها، هشدارهای مهم، و بهترین شیوه‌ها بررسی می‌شوند.

ادامه

آشنایی کامل با Django Settings: پیکربندی، مدیریت محیط، و بهترین شیوه‌ها

این مقاله یک راهنمای جامع دربارهٔ سیستم تنظیمات در Django ارائه می‌دهد. موضوعاتی مانند ساختار فایل تنظیمات، نحوهٔ تعیین DJANGO_SETTINGS_MODULE، استفاده از settings در کد، امنیت، پیکربندی دستی با configure()، استفادهٔ مستقل از Django با django.setup() و ایجاد تنظیمات سفارشی بررسی می‌شوند.

ادامه

سریال‌سازی و دسریال‌سازی در Django: راهنمای کامل کار با Serialization Framework

این مقاله سیستم سریال‌سازی Django را توضیح می‌دهد؛ از نحوهٔ تبدیل مدل‌ها به JSON، XML، YAML و JSONL گرفته تا دسریال‌سازی داده‌ها، سریال‌سازی فیلدهای انتخابی، کار با مدل‌های ارث‌بری، مدیریت روابط، و نکات مهم هنگام ذخیرهٔ داده‌های دسریال‌شده.

ادامه

بهینه‌سازی و افزایش کارایی در Django: راهنمای کامل Performance، Benchmarking، Caching و Laziness

این مقاله تکنیک‌ها و ابزارهای مهم برای بهبود کارایی در Django را بررسی می‌کند. موضوعاتی مانند تعریف اهداف بهینه‌سازی، Benchmarking، ابزارهای تحلیل عملکرد، انتخاب سطح مناسب برای انجام عملیات، استفاده از Caching، درک Laziness و رفتار QuerySetها توضیح داده شده است.

ادامه