[PYTHON] Lösen Sie eine Ausnahme oder ein Protokoll aus, wenn eine Django-Vorlagenvariable ungültig ist

Die Template-Engine von django ist tolerant, sodass das Aufrufen von Funktionen oder Variablen, die für ein Objekt nicht vorhanden sind, keine Ausnahme darstellt. In einem solchen Fall wird anstelle einer Ausnahme ein leeres Zeichen zum Rendern zugewiesen.

Dies ist eine Menge Verhalten, das in einer Produktionsumgebung geschätzt wird, aber es ist auch schön, einen Fehler in einer Entwicklungsumgebung zu haben. Auch in einer Produktionsumgebung sollte es möglich sein, zu protokollieren, auch wenn dies keinen Fehler verursacht.

Bis django1.8 funktionierte es mit der folgenden Methode, danach hat sich die Einstellungsmethode geändert. stackoverflow.com:show-undefined-variable-errors-in-django-templates

Sie können jetzt in settings.py einen Wert für TEMPLATES.OPTIONS.string_if_invalid festlegen. docs.djangoproject.com:How invalid variables are handled

Geben Sie hier "Was beim Zugriff auf eine nicht vorhandene Vorlagenvariable angezeigt werden soll" an. Grundsätzlich wird erwartet, dass eine Zeichenfolge festgelegt wird. Wenn Sie "% s" eingeben, wird der "Name der zugegriffenen (nicht vorhandenen) Variablen" angezeigt.

Wenn Sie hier die folgenden Einstellungen vornehmen, können Sie das Verhalten von "beim Zugriff auf eine nicht vorhandene Vorlagenvariable" definieren.

settings.py

class InvalidString(str):
    # "%s is ok" % undefined  :Für Zeichenfolgenformatoperationen__mod__Wird genannt
    def __mod__(self, other):
        msg = "Undefined variable or unknown value for: %s" % other
        if TEST or IS_LOCAL:
            #Ausnahme für Entwicklungsumgebung
            from django.template.base import TemplateSyntaxError
            raise TemplateSyntaxError(msg)
        else:
            #Protokollausgabe, wenn es nach Produktion aussieht
            import logging
            logger = logging.getLogger('strange')
            logger.info(msg)


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
            ],
            'string_if_invalid': InvalidString("%s"),  #Hier einstellen
        },
    },
]

__mod__ ist normalerweise int-like und schreibt das Verhalten, wenn der Rest berechnet wird. Wenn Sie so etwas wie eine Zeichenfolge definieren, wird diese während der Zeichenfolgenformatierung aufgerufen. In diesem Fall wird der Variablenname eingegeben und aufgerufen, auf den zugegriffen wurde, der jedoch nicht vorhanden ist.

Recommended Posts

Lösen Sie eine Ausnahme oder ein Protokoll aus, wenn eine Django-Vorlagenvariable ungültig ist
[Django] Memo, wenn das Protokoll nicht war
Ein Programm, das automatisch feststellt, ob es sich um eine Animation oder ein Foto handelt, wenn Sie das Bild einer Person eingeben [Python]