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