Creat seiceála an chóraisLink to this heading

Is sraith seiceálacha statacha é creat seiceála an chórais chun tionscadail Django a bhailíochtú. Braithíonn sé fadhbanna coitianta agus soláthraíonn sé leideanna maidir le conas iad a shocrú. Tá an creat inleathnaithe ionas gur féidir leat do sheiceálacha féin a chur leis go héasca.

Is féidir seiceálacha a spreagadh go sainráite tríd an ordú:djadmin: check. Cuirtear seiceálacha a spreagadh go hiontach roimh fhormhór na n-orduithe, lena n-áirítear: djadmin: runserver agus:djadmin: migrate. Ar chúiseanna feidhmíochta, ní reáchtáiltear seiceálacha mar chuid den chruach WSGI a úsáidtear in imscaradh. Más gá duit seiceálacha córais a reáchtáil ar do fhreastalaí imscartha, spreag iad go sainráite ag baint úsáide as: djadmin: check.

Cuirfidh earráidí tromchúiseacha cosc ar orduithe Django (mar shampla: djadmin: runserver) ó rith ar chor ar bith. Tuairiscítear mionfhadhbanna don chonsól. Má rinne tú iniúchadh ar chúis rabhaidh agus má tá tú sásta neamhaird a dhéanamh air, is féidir leat rabhaidh sonracha a cheilt ag baint úsáide as an socrú: setting: SILENCED_SYSTEM_CHECKS i do chomhad socruithe tionscadail.

Is féidir liosta iomlán de na seiceálacha go léir is féidir le Django a ardú a fháil in:doc: Tagairt seiceála córas </ref/checks>.

Do sheiceálacha féin a scríobhLink to this heading

Tá an creat solúbtha agus tugann sé deis duit feidhmeanna a scríobh a dhéanann aon chineál eile seiceála a d'fhéadfadh a bheith ag teastáil uait. Seo a leanas feidhm sheiceála stub sampla:

Code
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

Caithfidh an fheidhm seiceála* glacadh le hargóint app_configs; is é an argóint seo an liosta d'iarratais ar chóir a iniúchadh. Má tá ``None ``, ní mór an seiceáil a reáchtáil ar* gach aipeanna suiteáilte sa tionscadal.

Gheobhaidh an seic argóint eochairfhocal bunachar sonraí ``. Is liosta é seo d'ainmneacha bunachar sonraí ar féidir a naisc a úsáid chun cumraíocht leibhéal bunachar sonraí a iniúchadh. Más é ```bunachar sonraí ``None, ní mór don seiceáil aon naisc bunachar sonraí a úsáid.

Tá an argóint `**kwargs ``ag teastáil le haghaidh leathnú amach anseo.

TeachtaireachtaíLink to this heading

Caithfidh an fheidhm liosta teachtaireachtaí a thabhairt ar ais. Mura bhfaightear aon fhadhbanna mar thoradh ar an seiceáil, caithfidh an fheidhm seiceála liosta folamh a thabhairt ar ais.

Caithfidh na rabhaidh agus na hearráidí arna ardú ag an modh seiceála a bheith ina gcásanna de:class: ~django.core.checks.checkMessage. Cuimsíonn sampla de:class: ~Django.Core.Checks.CheckMessage earráid nó rabhadh amháin a thuairiscithe. Soláthraíonn sé comhthéacs agus leideanna is infheidhme maidir leis an teachtaireacht, agus aitheantóir uathúil a úsáidtear chun críocha scagtha.

Tá an coincheap an-chosúil le teachtaireachtaí óna:doc: `creat teachtaireachtaí `nó la:doc: `creat logála `</ref/contrib/messages> </topics/logging>. Tá 'leibhéal' clibeáilte ag teachtaireachtaí a léiríonn déine na teachtaireachta.

Tá aicearraí ann freisin chun teachtaireachtaí a chruthú le leibhéil choiteanna a dhéanamh níos éasca. Agus na ranganna seo á úsáid agat is féidir leat an argóint ``leibhéil ``a fhágáil toisc go bhfuil ainm an ranga intuigthe air.

Seiceálacha clárú agus lipéadLink to this heading

Ar deireadh, caithfear d'fheidhm seiceála a chlárú go sainráite le clárlann seiceála córais. <django.apps.AppConfig.ready>Ba chóir seiceálacha a chlárú i gcomhad a luchtaítear nuair a luchtaítear d'iarratas; mar shampla, sa modh:meth: `AppConfig.ready () `.

register(*tags)(function)Link to this definition

Is féidir leat an oiread clibeanna a chur chuig clár agus is mian leat d'fhonn do sheic a lipéadú. Tá seiceálacha clibeála úsáideach ós rud é go gceadaíonn sé duit ach grúpa áirithe seiceálacha a reáchtáil. Mar shampla, chun seiceáil comhoiriúnachta a chlárú, déanfá an glao seo a leanas:

Code
from django.core.checks import register, Tags


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

Is féidir leat “seiceálacha imscartha” a chlárú nach bhfuil ábhartha ach le comhad socruithe táirgeachta mar seo:

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

Ní reáchtálfar na seiceálacha seo ach amháin má úsáidtear an rogha: check --deploy.

Is féidir leat clár a úsáid freisin mar fheidhm seachas maisitheoir trí réad inghlaonta (feidhm de ghnáth) a chur ar aghaidh mar an chéad argóint chun clár.

Tá an cód thíos comhionann leis an gcód thuas:

Code
def my_check(app_configs, **kwargs): ...


register(my_check, Tags.security, deploy=True)

Field, constraint, model, manager, template engine, task, and database checksLink to this heading

I roinnt cásanna, ní bheidh ort do fheidhm seiceála a chlárú - is féidir leat piggyback ar chlárú atá ann cheana.

Fields, constraints, models, model managers, template engines, task backends, and database backends all implement a check() method that is already registered with the check framework. If you want to add extra checks, you can extend the implementation on the base class, perform any extra checks you need, and append any messages to those generated by the base class. It's recommended that you delegate each check to separate methods.

Smaoinigh ar shampla ina bhfuil réimse saincheaptha darb ainm RangedIntegerField á chur i bhfeidhm agat. Cuireann an réimse seo argóintí min agus max le tógálaí IntegerField. B'fhéidir gur mhaith leat seic a chur leis chun a chinntiú go soláthraíonn úsáideoirí luach íosta atá níos lú ná nó comhionann leis an luach uasta. Taispeánann an snippet cód seo a leanas conas is féidir leat an seiceáil seo a chur i bhfeidhm:

Code
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 []

Dá dteastaíonn uait seiceálacha a chur le bainisteoir samhail, glacfá an cur chuige céanna ar do fho-aicme de:class: ~Django.db.Models.Manager.

Más mian leat seic a chur le rang samhail, is é an cur chuige *beagnach mar an gcéanna: is é an t-aon difríocht ná gur modh ranga é an seiceáil, ní modh sampla:

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

Tástála scríbhneoLink to this heading

Tá teachtaireachtaí inchomparáide. Ligeann sé sin duit tástálacha a scríobh go héasca:

Code
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)

Tástálacha comhtháthaithe aLink to this heading

Mar gheall ar an ngá atá le seiceálacha áirithe a chlárú nuair a luchtaíonn an feidhmchlár, d'fhéadfadh sé a bheith úsáideach a gcomhtháthú a thástáil laistigh Is féidir é seo a chur i gcrích tríd an bhfeidhm: func: ~django.core.management.call_command a úsáid.

<sites-system-checks>Mar shampla, léiríonn an tástáil seo go gcaithfidh an socrúit:setting: SITE_ID a bheith ina sláimhir, ina ion:ref: `seiceáil ó chreat na suíomhanna `:

Code
from django.core.management import call_command
from django.core.management.base import SystemCheckError
from django.test import SimpleTestCase, modify_settings, override_settings


class SystemCheckIntegrationTest(SimpleTestCase):
    @override_settings(SITE_ID="non_integer")
    @modify_settings(INSTALLED_APPS={"prepend": "django.contrib.sites"})
    def test_non_integer_site_id(self):
        message = "(sites.E101) The SITE_ID setting must be an integer."
        with self.assertRaisesMessage(SystemCheckError, message):
            call_command("check")

Smaoinigh ar an seiceáil seo a leanas a eisíonn rabhadh maidir le himscaradh mura bhfuil socrú saincheaptha darb ainm ENABLE_ANALYTICS` socraithe go True:

Code
from django.conf import settings
from django.core.checks import Warning, register


@register("myapp", deploy=True)
def check_enable_analytics_is_true_on_deploy(app_configs, **kwargs):
    errors = []
    if getattr(settings, "ENABLE_ANALYTICS", None) is not True:
        errors.append(
            Warning(
                "The ENABLE_ANALYTICS setting should be set to True in deployment.",
                id="myapp.W001",
            )
        )
    return errors

Ós rud é nach n-ardóidh an seiceáil seo SystemCheckerror`, is féidir láithreacht na teachtaireachta rabhaidh san aschur stderr a dhearbhú mar seo:

Code
from io import StringIO

from django.core.management import call_command
from django.test import SimpleTestCase, override_settings


class EnableAnalyticsDeploymentCheckTest(SimpleTestCase):
    @override_settings(ENABLE_ANALYTICS=None)
    def test_when_set_to_none(self):
        stderr = StringIO()
        call_command("check", "-t", "myapp", "--deploy", stderr=stderr)
        message = (
            "(myapp.W001) The ENABLE_ANALYTICS setting should be set "
            "to True in deployment."
        )
        self.assertIn(message, stderr.getvalue())