Django Signal request_finished get user instanse

Viewed 226

I try to understand Signals in Django. I am creating project for DRF.

from django.dispatch import receiver
from django.contrib.auth.signals import user_logged_in
from django.core.signals import request_finished

For this Signal I can catch user

@receiver(user_logged_in)
def last_user_login(sender, request, user, **kwargs):
    print('User **{}** logged in'.format(user))

And I want to catch user for this signal, but it's impossible as I understood.

@receiver(request_finished)
def last_user_request(sender, **kwargs):
    print('User made request')

My target: catch last user request and write this data to db.

Could someone help me? Thanks.

2 Answers

request_finished signal only has information about its sender class, as you can see in HttpResponseBase class where its sent:

signals.request_finished.send(sender=self._handler_class)

In order to accomplish what you want, you could look into writing a custom middleware, where you will have access to the request object and thus to User as well. Think it through if you really want to write to the db there, it might be slow.

write a custom middleware to achieve this:

middleware.py:

class SimpleMiddleware:
   def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.
    
    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
    
        response = self.get_response(request)
    
        print(response.status_code)
        print(request.user.username)
        # Add user data in db....
        if request.method == 'POST':
            print(request.POST)
    
        # Code to be executed for each request/response after
        # the view is called.
    
        return response

settings.py:

MIDDLEWARE = [

    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',    
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
     
    'myproject.middleware.SimpleMiddleware',
    
]
Related