Django 2.1 - System check framework

सिस्टम चेक फ्रेमवर्क




django

सिस्टम चेक फ्रेमवर्क

सिस्टम चेक फ्रेमवर्क Django परियोजनाओं को मान्य करने के लिए स्थैतिक चेक का एक सेट है। यह आम समस्याओं का पता लगाता है और उन्हें ठीक करने के लिए संकेत प्रदान करता है। ढांचा विस्तृत है, ताकि आप आसानी से अपनी जांच जोड़ सकें।

चेक कमांड के माध्यम से check को स्पष्ट रूप से ट्रिगर किया जा सकता है। runserver और migrate सहित अधिकांश आदेशों से पहले चेक को स्पष्ट रूप से ट्रिगर किया जाता है। प्रदर्शन कारणों से, डब्लूएसजीआई स्टैक के हिस्से के रूप में चेक नहीं चलाए जाते हैं जो कि तैनाती में उपयोग किया जाता है। यदि आपको अपने परिनियोजन सर्वर पर सिस्टम चेक चलाने की आवश्यकता है, तो check का उपयोग करके उन्हें स्पष्ट रूप से ट्रिगर check

गंभीर त्रुटियां Django कमांड्स (जैसे runserver ) को runserver चलने से runserver । कंसोल को मामूली समस्याएं बताई गई हैं। यदि आपने एक चेतावनी के कारण का निरीक्षण किया है और इसे अनदेखा करने में खुशी हो रही है, तो आप अपनी परियोजना सेटिंग्स फ़ाइल में 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 का एक उदाहरण एक रिपोर्ट करने योग्य त्रुटि या चेतावनी को CheckMessage करता है। यह संदेश पर लागू संदर्भ और संकेत भी प्रदान करता है, और एक विशिष्ट पहचानकर्ता जिसका उपयोग फ़िल्टरिंग उद्देश्यों के लिए किया जाता है।

अवधारणा संदेश के ढांचे या लॉगिंग ढांचे से संदेशों के समान है। संदेशों को संदेश की गंभीरता का संकेत देने वाले level साथ टैग किया जाता है।

आम स्तर के साथ संदेश बनाने के लिए शॉर्टकट भी हैं जो आसान हैं। इन कक्षाओं का उपयोग करते समय आप level तर्क को छोड़ सकते हैं क्योंकि यह वर्ग नाम से निहित है।

पंजीकरण और लेबलिंग जाँच

अंत में, आपके चेक फ़ंक्शन को सिस्टम चेक रजिस्ट्री के साथ स्पष्ट रूप से पंजीकृत होना चाहिए। चेक को एक फ़ाइल में पंजीकृत होना चाहिए जो आपके आवेदन के लोड होने पर लोड की जाती है; उदाहरण के लिए, AppConfig.ready() विधि में।

register(*tags)(function)

आप अपने चेक को लेबल करने के लिए जितने चाहें उतने टैग 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 करने के लिए पहले तर्क के रूप में एक कॉल करने योग्य वस्तु (आमतौर पर एक फ़ंक्शन) को पारित करके एक डेकोरेटर के बजाय एक फ़ंक्शन के रूप में register उपयोग कर सकते हैं।

नीचे दिया गया कोड ऊपर दिए गए कोड के बराबर है:

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

फ़ील्ड, मॉडल, प्रबंधक और डेटाबेस चेक

कुछ मामलों में, आपको अपने चेक फ़ंक्शन को पंजीकृत करने की आवश्यकता नहीं होगी - आप मौजूदा पंजीकरण पर गुल्लक कर सकते हैं।

फ़ील्ड, मॉडल, मॉडल प्रबंधक और डेटाबेस सभी एक check() विधि को लागू करते हैं जो पहले से ही चेक फ्रेमवर्क के साथ पंजीकृत है। यदि आप अतिरिक्त चेक जोड़ना चाहते हैं, तो आप बेस क्लास पर कार्यान्वयन का विस्तार कर सकते हैं, अपनी ज़रूरत के किसी भी अतिरिक्त चेक का प्रदर्शन कर सकते हैं और बेस क्लास द्वारा उत्पन्न किए गए किसी भी संदेश को जोड़ सकते हैं। यह अनुशंसा की जाती है कि आप प्रत्येक चेक को अलग-अलग तरीकों से सौंपें।

एक उदाहरण पर विचार करें जहां आप एक कस्टम फ़ील्ड लागू कर रहे हैं जिसका नाम RangedIntegerField । यह फ़ील्ड IntegerField के निर्माता के लिए 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)