Search code examples
djangodjango-rest-frameworkdjango-signals

Django Signal request_finished get user instanse


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.


Solution

  • 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',
        
    ]