[PYTHON] Fügen Sie den ursprünglichen Kontextprozessor hinzu

Dieser Artikel ist der Artikel zum 25. Tag des Django 2016 Adventskalenders.

Es tut mir leid für die Grundlagen am letzten Tag, aber da ich sie selbst nie hinzugefügt habe, werde ich über das Studium und die Implementierung von context_processors schreiben.

Nein, Python 3.6 ist da!

** Was in diesem Artikel geschrieben steht **: Hinzufügen von Kontextprozessoren, Implementierungsbeispiel ** Was ich in diesem Artikel schreibe **: Verhalten in context_processors

Auslösen

Im Moment reagiert die Site, die ich entwickle, vollständig auf das Schreiben von Vorlagen, aber jetzt muss ich einige der Vorlagen für Mobilgeräte und PCs trennen.

Also habe ich versucht, django-mobile zu verwenden, aber es war noch nicht mit Django 1.10 kompatibel. Es gab auch eine Möglichkeit, die Pull-Anfrage selbst herauszubekommen, aber ich hatte nicht viel Zeit und musste das nicht schwierig machen, also entschied ich mich, sie selbst zu implementieren. Ich habe nie context_processors verwendet, also habe ich zuerst das Dokument gelesen. Es war wirklich einfach.

django-mobile hat auch Middleware, aber ich brauchte sie diesmal nicht, also habe ich nur context_processors studiert.

Was ist context_processors?

Sie können Variablen in der Vorlage verwenden, ohne sie direkt aus der Ansicht übergeben zu müssen.

Implementierung

Standardmäßig sollte TEMPLATES in settings.py (wahrscheinlich) folgendermaßen aussehen:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Unten finden Sie den Inhalt von django / templates / context_processors.py. Da es lang ist, lasse ich es in der Mitte weg.

django/templates/context_processors.py



"""
A set of request processors that return dictionaries to be merged into a
template context. Each function takes the request object as its only parameter
and returns a dictionary to add to the context.

These are referenced from the 'context_processors' option of the configuration
of a DjangoTemplates backend and used by RequestContext.
"""

from __future__ import unicode_literals

import itertools

from django.conf import settings
from django.middleware.csrf import get_token
from django.utils.encoding import smart_text
from django.utils.functional import SimpleLazyObject, lazy


def csrf(request):
    """
    Context processor that provides a CSRF token, or the string 'NOTPROVIDED' if
    it has not been provided by either a view decorator or the middleware
    """
    def _get_val():
        token = get_token(request)
        if token is None:
            # In order to be able to provide debugging info in the
            # case of misconfiguration, we use a sentinel value
            # instead of returning an empty dict.
            return 'NOTPROVIDED'
        else:
            return smart_text(token)

    return {'csrf_token': SimpleLazyObject(_get_val)}

"""
Unterwegs weggelassen
"""

def request(request):
    return {'request': request}

Wenn Sie den Pfad der Funktion in context_processors von TEMPLATES oben angeben, können Sie die Funktion in der Vorlage aufrufen und den Rückgabewert für die Vorlage verwenden. Sie müssen es nicht explizit von der Ansicht an die Vorlage übergeben.

Hierbei ist zu beachten, dass Sie hoge nicht mit einer Vorlage aufrufen können, selbst wenn Sie eine Funktion namens "hoge" mit "context_processors" erstellen. Genau wie beim Übergeben einer Variablen von der Ansicht an die Vorlage können Sie die Variable und den Inhalt mit dem gewünschten Namen mit dict angeben und zurückgeben, und Sie können mit der Vorlage auf den Schlüssel dieses Dikts verweisen. Wenn die folgenden Funktionen in context_processors enthalten sind, wird daher in der Vorlage auf fuga verwiesen, und die Zeichenfolge fugafuga kann in der Vorlage verwendet werden.

Definition

def hoge(request):
    return {"fuga": "fugafuga"}

Referenz

{{ fuga }}

Daher rufen Sie für standardmäßig bereitgestelltes csrf csrf_token wie in django / templates / context_processors.py anstelle von csrf auf.

{% csrf_token %}

Hinweis

Die obige settings.py lädt nicht "django.template.context_processors.csrf", sondern "csrf" wird speziell behandelt und ist standardmäßig an den folgenden Speicherorten geladen.

django/template/context.py



# Hard-coded processor for easier use of CSRF protection.
_builtin_context_processors = ('django.template.context_processors.csrf',)

django/template/engine.py


class Engine(object):
    """
Kürzung
    """

    @cached_property
    def template_context_processors(self):
        context_processors = _builtin_context_processors
        context_processors += tuple(self.context_processors)
        return tuple(import_string(path) for path in context_processors)
    """
Kürzung
    """

Versuchen Sie es selbst zu implementieren

Wie ich zu Beginn geschrieben habe, möchte ich dasselbe wie django-mobile tun, daher werde ich anhand der in der Anforderung enthaltenen Benutzeragenteninformationen einen context_processor hinzufügen, der bestimmt, ob es sich um ein Smartphone handelt, und True oder False zurückgeben.

Die, die ich gemacht habe, sind wie folgt. Mecha ist einfach w

app/context_processors.py



import re
MOBILE_REGEXP = re.compile(r"Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone|IEMobile|Opera Mini|WILLCOM")

def is_mobile(request):
    is_mobile = False
    if MOBILE_REGEXP.search(request.META['HTTP_USER_AGENT']) is not None:
        is_mobile = True
    return {"is_mobile": is_mobile}

Fügen Sie "app.context_processors.is_mobile" zu "context_processors" in TEMPLATES hinzu.

settings.py


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'app.context_processors.is_mobile',  #Dies
            ],
        },
    },
]

Und verwenden Sie es wie folgt.

{% if is_mobile == True %}
<p>Zugriff vom Handy</p>
{% else %}
<p>Zugriff vom PC</p>
{% endif %}

Zusammenfassung

Ich fand es sehr einfach, context_processor hinzuzufügen. Ich habe nur untersucht, wie es implementiert werden soll. Wenn ich also Zeit habe, möchte ich den internen Betrieb richtig studieren.

Schließlich

Ich war sehr überrascht, dass ich nicht erwartet hatte, dass sich Djangos Adventskalender so weit füllen würde. Viele Leute waren für mehrere Tage verantwortlich und vielen Dank!

Ich selbst hatte noch viele grundlegende Beiträge für Anfänger, also hoffe ich, dass ich nächstes Jahr um diese Zeit etwas höheres schreiben kann! (Es ist nicht gut für das Unternehmen, es knusprig zu entwickeln ...!)

Nächstes Jahr hoffe ich, dass Django in Japan aufregender sein wird als in diesem Jahr, und ich möchte den letzten Tag des Adventskalenders abschließen. Alle, genießt Weihnachten! !! (Erbrechen) & ein gutes Jahr! !! !!

Recommended Posts

Fügen Sie den ursprünglichen Kontextprozessor hinzu
Vorbereiten des Ladens des Originaldatensatzes
Führen Sie das Original YOLO mit Jetson Nano aus
Fügen Sie in Jupyter IPerl zum Kernel hinzu.
Fügen Sie mithilfe des Keras-Backends eine Ebene hinzu
Fügen Sie dem Bild Linien und Text hinzu