[PYTHON] J'ai créé mon propre middleware Django afin de pouvoir accéder aux informations de demande de n'importe où

J'ai commencé à me demander si l'utilisateur connecté pouvait être stocké dans un traitement commun pour user_created (créateur) et user_updated (updater) du modèle.

Jusque-là, j'ai écrit le processus de transmission des informations utilisateur de vue en formulaire et de stockage dans user_created et user_updated.

Quel est le middleware de Django?

De Officiel

L'intergiciel est un framework pour ajouter des hooks au traitement des requêtes / réponses de Django.

Vous pouvez définir le traitement à effectuer lors de l'envoi d'une requête ou avant de renvoyer une réponse.

Implémentation de middleware

Définir une fonction qui opère threadlocal

common/middlewares/threadlocals.py


from threading import local


THREAD_LOCAL = local()


def set_thread_variable(key, value):
    """Stocker la valeur dans les données locales du thread
    """
    setattr(THREAD_LOCAL, key, value)


def get_thread_variable(key, default=None):
    """Obtenir de la valeur à partir des données locales des threads
    """
    return getattr(THREAD_LOCAL, key, default)


def get_request():
    """Obtenir des informations de demande à partir des données locales des threads
    """
    return get_thread_variable('request')

Définir la classe middleware

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)

Puisque nous voulons des informations de demande cette fois, nous définirons uniquement process_request.

Ajouté à MIDDLEWARE dans settings.py

settings.py


.
..
...
MIDDLEWARE = [
    .
    ..
    ...
    'common.middlewares.request_store_middleware.RequestStoreMiddleware', #ajouter à
]
...
..
.

Appelez simplement get_request où vous voulez

J'ai décidé de l'utiliser dans models.py car le but est de stocker les informations utilisateur lors de l'enregistrement dans DB.

common/models.py


.
..
...
from common.middlewares.threadlocals import get_request
from django.db.models.signals import pre_save
...
..
.
class Company(BaseModel):
    """Classe de modèle d'entreprise
    """
    ...
    ..
    .
    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() #Le contrôle d'authentification peut être effectué avant de stocker les informations utilisateur
    instance.created_user = request.user
    instance.updated_user = request.user


pre_save.connect(set_user_receiver, sender=Company) # pre_Si vous utilisez Enregistrer, enregistrez()Vous pouvez enregistrer la fonction que vous souhaitez appeler avant son exécution.

fin

Recommended Posts

J'ai créé mon propre middleware Django afin de pouvoir accéder aux informations de demande de n'importe où
[Python] J'ai créé ma propre bibliothèque qui peut être importée dynamiquement
J'ai essayé de publier mon propre module pour pouvoir l'installer
J'ai fait ma propre langue. (1)
J'ai fait ma propre langue (2)
J'ai fait ma propre AML
J'ai créé ma propre bibliothèque Python
[Python] J'ai créé un utilitaire qui peut accéder au type dict comme un chemin
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
J'ai créé une IA qui prédit des anecdotes et m'a fait déduire mes anecdotes. Hee-AI
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
En Python, j'ai créé un LINE Bot qui envoie des informations sur le pollen à partir des informations de localisation.
J'ai créé mon propre robot de liaison parallèle (édition logicielle)
J'ai fait un module qui peut être glitch facilement, mais je ne peux pas passer l'argument de entry_points