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.
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.
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')
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
.
settings.py
.
..
...
MIDDLEWARE = [
.
..
...
'common.middlewares.request_store_middleware.RequestStoreMiddleware', #ajouter à
]
...
..
.
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