[PYTHON] Ich habe meine eigene Django Middleware erstellt, damit ich von überall auf Anforderungsinformationen zugreifen kann

Ich begann darüber nachzudenken, ob der angemeldete Benutzer durch gemeinsame Verarbeitung im Modell user_created (Ersteller) und user_updated (Updater) gespeichert werden könnte.

Bis dahin habe ich den Prozess des Übergebens von Benutzerinformationen von der Ansicht an das Formular und des Speicherns in user_created und user_updated geschrieben.

Was ist Djangos Middleware?

Middleware ist ein Framework zum Hinzufügen von Hooks zur Anforderungs- / Antwortverarbeitung von Django.

Sie können die Verarbeitung definieren, die beim Senden einer Anfrage oder vor dem Zurücksenden einer Antwort ausgeführt werden soll.

Implementierung von Middleware

Definieren Sie eine Funktion, die threadlokal arbeitet

common/middlewares/threadlocals.py


from threading import local


THREAD_LOCAL = local()


def set_thread_variable(key, value):
    """Speichern Sie den Wert in den lokalen Thread-Daten
    """
    setattr(THREAD_LOCAL, key, value)


def get_thread_variable(key, default=None):
    """Wert aus lokalen Thread-Daten abrufen
    """
    return getattr(THREAD_LOCAL, key, default)


def get_request():
    """Abfrageinformationen aus lokalen Thread-Daten abrufen
    """
    return get_thread_variable('request')

Middleware-Klasse definieren

common/middlewares/request_store_middleware.py


from common.middlewares.threadlocals import set_thread_variable
from django.utils.deprecation import MiddlewareMixin


class RequestStoreMiddleware(MiddlewareMixin):
    def process_request(self, reuqest):
        set_thread_variable('request', reuqest)

Dieses Mal möchte ich die Anforderungsinformationen, daher definiere ich nur "process_request".

Zu MIDDLEWARE in settings.py hinzugefügt

settings.py


.
..
...
MIDDLEWARE = [
    .
    ..
    ...
    'common.middlewares.request_store_middleware.RequestStoreMiddleware', #hinzufügen
]
...
..
.

Rufen Sie einfach get_request an, wo immer Sie möchten

Ich habe mich für die Verwendung in models.py entschieden, da der Zweck darin besteht, Benutzerinformationen beim Speichern in der Datenbank zu speichern.

common/models.py


.
..
...
from common.middlewares.threadlocals import get_request
from django.db.models.signals import pre_save
...
..
.
class Company(BaseModel):
    """Unternehmensmodellklasse
    """
    ...
    ..
    .
    created_user = models.ForeignKey(User, on_delete=models.DO_NOTHING, null=True, blank=True)
    updated_user = models.ForeignKey(User, on_delete=models.DO_NOTHING, null=True, blank=True)
...
..
.
def set_user_receiver(sender, instance, *args, **kwargs)
    request = get_request() #Die Authentifizierungsprüfung kann vor dem Speichern von Benutzerinformationen durchgeführt werden
    instance.created_user = request.user
    instance.updated_user = request.user


pre_save.connect(set_user_receiver, sender=Company) # pre_Wenn Sie Speichern verwenden, speichern Sie()Sie können die Funktion, die Sie aufrufen möchten, vor der Ausführung registrieren.

Ende

Recommended Posts

Ich habe meine eigene Django Middleware erstellt, damit ich von überall auf Anforderungsinformationen zugreifen kann
[Python] Ich habe meine eigene Bibliothek erstellt, die dynamisch importiert werden kann
Ich habe versucht, mein eigenes Modul zu veröffentlichen, damit ich es per Pip installieren kann
Ich habe meine eigene Sprache gemacht. (1)
Ich habe meine eigene Sprache gemacht (2)
Ich habe meine eigene AML gemacht
Ich habe meine eigene Python-Bibliothek erstellt
[Python] Ich habe ein Dienstprogramm erstellt, das wie ein Pfad auf den Diktattyp zugreifen kann
Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann
Ich habe eine KI erstellt, die aus Trivia vorhersagt, und mich dazu gebracht, auf meine Trivia zu schließen. Hee-AI
Ich habe ein Docker-Image erstellt, das FBX SDK Python von Node.js aus aufrufen kann
In Python habe ich einen LINE-Bot erstellt, der Polleninformationen aus Standortinformationen sendet.
Ich habe meinen eigenen Parallel Link Roboter (Software Edition) gemacht
Ich habe ein Modul erstellt, das leicht fehlerhaft sein kann, aber ich kann das Argument nicht von entry_points übergeben